一:newCachedThreadPool

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),建水企業(yè)網(wǎng)站建設(shè),建水品牌網(wǎng)站建設(shè),網(wǎng)站定制,建水網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,建水網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
(1)緩存型池子,先查看池中有沒有以前建立的線程,如果有,就reuse,如果沒有,就建立一個(gè)新的線程加入池中;
(2)緩存型池子,通常用于執(zhí)行一些生存周期很短的異步型任務(wù);因此一些面向連接的daemon型server中用得不多;
(3)能reuse的線程,必須是timeout IDLE內(nèi)的池中線程,缺省timeout是60s,超過這個(gè)IDLE時(shí)長(zhǎng),線程實(shí)例將被終止及移出池。
(4)注意,放入CachedThreadPool的線程不必?fù)?dān)心其結(jié)束,超過TIMEOUT不活動(dòng),其會(huì)自動(dòng)被終止
二:newFixedThreadPool
(1)newFixedThreadPool與cacheThreadPool差不多,也是能reuse就用,但不能隨時(shí)建新的線程
(2)其獨(dú)特之處:任意時(shí)間點(diǎn),最多只能有固定數(shù)目的活動(dòng)線程存在,此時(shí)如果有新的線程要建立,只能放在另外的隊(duì)列中等待,直到當(dāng)前的線程中某個(gè)線程終止直接被移出池子
(3)和cacheThreadPool不同,F(xiàn)ixedThreadPool沒有IDLE機(jī)制(可能也有,但既然文檔沒提,肯定非常長(zhǎng),類似依賴上層的TCP或UDP IDLE機(jī)制之類的),所以FixedThreadPool多數(shù)針對(duì)一些很穩(wěn)定很固定的正規(guī)并發(fā)線程,多用于服務(wù)器
(4)從方法的源代碼看,cache池和fixed 池調(diào)用的是同一個(gè)底層池,只不過參數(shù)不同:
fixed池線程數(shù)固定,并且是0秒IDLE(無IDLE)
cache池線程數(shù)支持0-Integer.MAX_VALUE(顯然完全沒考慮主機(jī)的資源承受能力),60秒IDLE
三:ScheduledThreadPool
(1)調(diào)度型線程池
(2)這個(gè)池子里的線程可以按schedule依次delay執(zhí)行,或周期執(zhí)行
四:SingleThreadExecutor
(1)單例線程,任意時(shí)間池中只能有一個(gè)線程
(2)用的是和cache池和fixed池相同的底層池,但線程數(shù)目是1-1,0秒IDLE(無IDLE)
首先說明下java線程是如何實(shí)現(xiàn)線程重用的
1. 線程執(zhí)行完一個(gè)Runnable的run()方法后,不會(huì)被殺死
2. 當(dāng)線程被重用時(shí),這個(gè)線程會(huì)進(jìn)入新Runnable對(duì)象的run()方法12
java線程池由Executors提供的幾種靜態(tài)方法創(chuàng)建線程池。下面通過代碼片段簡(jiǎn)單介紹下線程池的幾種實(shí)現(xiàn)方式。后續(xù)會(huì)針對(duì)每個(gè)實(shí)現(xiàn)方式做詳細(xì)的說明
newFixedThreadPool
創(chuàng)建一個(gè)固定大小的線程池
添加的任務(wù)達(dá)到線程池的容量之后開始加入任務(wù)隊(duì)列開始線程重用總共開啟線程個(gè)數(shù)跟指定容量相同。
@Test
public void newFixedThreadPool() throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService = Executors.newFixedThreadPool(1, new ThreadFactoryBuilder().build());
RunThread run1 = new RunThread("run 1");
executorService.execute(run1);
executorService.shutdown();
}12345678
newSingleThreadExecutor
僅支持單線程順序處理任務(wù)
@Test
public void newSingleThreadExecutor() throws Exception {
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().build());
executorService.execute(new RunThread("run 1"));
executorService.execute(new RunThread("run 2"));
executorService.shutdown();
}123456789
newCachedThreadPool
這種情況跟第一種的方式類似,不同的是這種情況線程池容量上線是Integer.MAX_VALUE 并且線程池開啟緩存60s
@Test
public void newCachedThreadPool() throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService = Executors.newCachedThreadPool(new ThreadFactoryBuilder().build());
executorService.execute(new RunThread("run 1"));
executorService.execute(new RunThread("run 2"));
executorService.shutdown();
}123456789
newWorkStealingPool
支持給定的并行級(jí)別,并且可以使用多個(gè)隊(duì)列來減少爭(zhēng)用。
@Test
public void newWorkStealingPool() throws Exception {
ExecutorService executorService = Executors.newWorkStealingPool();
executorService = Executors.newWorkStealingPool(1);
RunThread run1 = new RunThread("run 1");
executorService.execute(run1);
executorService.shutdown();
}123456789
newScheduledThreadPool
看到的現(xiàn)象和第一種相同,也是在線程池滿之前是新建線程,然后開始進(jìn)入任務(wù)隊(duì)列,進(jìn)行線程重用
支持定時(shí)周期執(zhí)行任務(wù)(還沒有看完)
@Test
public void newScheduledThreadPool() throws Exception {
ExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService = Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().build());
executorService.execute(new RunThread("run 1"));
executorService.execute(new RunThread("run 2"));
executorService.shutdown();
}
ExecutorService是個(gè)接口,如果你是用Executors靜態(tài)方法生產(chǎn)的實(shí)例,見具體實(shí)現(xiàn)。比如:Java代碼publicstaticExecutorServicenewFixedThreadPool(intnThreads,ThreadFactorythreadFactory){returnnewThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue(),threadFactory);}那它是ThreadPoolExecutor的實(shí)例,你可以看它的方法,如getActiveCount(),getPoolSize()等。
名稱欄目:java線程池實(shí)例代碼,Java線程池代碼
URL標(biāo)題:http://chinadenli.net/article17/dsgiidj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、域名注冊(cè)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)