網站建設方案市場營銷策劃方案
1.1? 線程:
線程就是進程中的單個順序控制流,也可以理解成是一條執(zhí)行路徑
單線程:一個進程中包含一個順序控制流(一條執(zhí)行路徑)
多線程:一個進程中包含多個順序控制流(多條執(zhí)行路徑)
在java語言中:
?線程A和線程B,堆內存和方法區(qū)內存共享。
?但是棧內存獨立,一個線程一個棧。
假設啟動10個線程,會有10個??臻g,每個棧和每個棧之間,互不干擾,各自執(zhí)行各自的,這就是多線程并發(fā)。
java中之所以有多線程機制,目的就是為了提高程序的處理效率。
對于單核的CPU來說,不能夠做到真正的多線程并發(fā),但是可以做到給人一種“多線程并發(fā)”的感覺。對于單核的CPU來說,在某一個時間點上實際上只能處理一件事情,但是由于CPU的處理速度極快,多個線程之間頻繁切換執(zhí)行,跟人來的感覺是多個事情同時在做。
?1.2 線程的生命周期
1.3?線程池
????????線程池可以看做是線程的集合。它的工作主要是控制運行的線程的數量,處理過程中將任務放入隊列,然后在線程創(chuàng)建后 啟動這些任務,如果線程數量超過了最大數量超出數量的線程排隊等候,等其它線程執(zhí)行完畢, 再從隊列中取出任務來執(zhí)行。他的主要特點為:線程復用;控制最大并發(fā)數;管理線程。
1.4?為什么使用線程池
????????使用線程池最大的原因就是可以根據系統(tǒng)的需求和硬件環(huán)境靈活的控制線程的數量,且可以對所有的線程進行統(tǒng)一的管理和控制,從而提高系統(tǒng)的運行效率,降低系統(tǒng)運行壓力;當然了,使用線程池的原因不僅僅只有這些,我們可以從線程池自身的優(yōu)點上來進一步了解線程池的好處。(1)線程和任務分離,提升線程的重用性。
(2)控制線程的并發(fā)數量,降低服務器壓力,統(tǒng)一管理所有的線程。
(3)提升系統(tǒng)的響應速度,假如創(chuàng)建線程用的時間為T1,執(zhí)行任務用的時間為T2,銷毀線程用的時間為T3,那么使用線程就免去了T1和T3的時間。
1.5?線程池的應用場景
(1)商品秒殺
(2)云盤文件上傳下載
(3)12306 網上購票系統(tǒng)
總之,只要是有并發(fā)的地方、任務量大或者小、每個任務執(zhí)行時間長或短的都可以使用線程池,只不過在使用線程池的時候,注意下設置合理的線程池大小即可;
2.1 實現方式 (springboot實現多線程)
1. 自定義線程池配置,我自己的項目在沒有充分的把握情況下一般不修改手腳架的配置,避免出現不明原因。加上我們經理之前也教我,能不修改別人的代碼,盡量不修改別人的代碼,因為你不確定別人是如何調用的。
/*** xxx業(yè)務專用的線程池配置類*/
@Configuration
public class TalentIotThreadConfig {/*** ThreadPoolTaskExecutor的處理流程* 當池子大小小于corePoolSize,就新建線程,并處理請求* 當池子大小等于corePoolSize,把請求放入workQueue中,池子里的空閑線程就去workQueue中取任務并處理* 當workQueue放不下任務時,就新建線程放入線程池,并處理請求,如果池子大小撐到了maximumPoolSize,就用RejectedExecutionHandler來做拒絕處理* 當池子的線程數大于corePoolSize時,多余的線程會等待keepAliveTime長時間,如果無請求可處理就自行銷毀** @return*/@Bean("TalentIotThread")public ThreadPoolTaskExecutor getAsyncExecutor() {ThreadPoolTaskExecutor tp = new ThreadPoolTaskExecutor();//設置核心線程數tp.setCorePoolSize(10);//設置最大線程數tp.setMaxPoolSize(100);//線程使用的緩沖隊列tp.setQueueCapacity(10);//設置程序關閉時要等待線程全部執(zhí)行完tp.setWaitForTasksToCompleteOnShutdown(true);//設置等待時間,超過等待時間后立即停止tp.setAwaitTerminationSeconds(60);//線程名稱前綴tp.setThreadNamePrefix("talent-iot-task-");//初始化線程tp.initialize();return tp;}}
2. 調用,ThreadPoolExecutor它的頂級父類是Executor接口,只包含了一個方法——execute,這個方法也就是線程池的“執(zhí)行”。
public class IotTimer {//通過注解引入配置@Resource(name = "TalentIotThread")private Executor executor;@Scheduled(cron = "0 */2 * * * ?")void talIotDataShare() {for (TalIotDateShare iotDateShare : shareList) {executor.execute(() -> {// 業(yè)務代碼 });}}}