如果你提交任務(wù)時(shí),線程池隊(duì)列已滿,這時(shí)會(huì)發(fā)生什么?
這里區(qū)分一下:
1裁奇、如果使用的是無(wú)界隊(duì)列 LinkedBlockingQueue桐猬,也就是無(wú)界隊(duì)列的話麦撵,沒(méi)關(guān)
系,繼續(xù)添加任務(wù)到阻塞隊(duì)列中等待執(zhí)行溃肪,因?yàn)?LinkedBlockingQueue 可以近乎
認(rèn)為是一個(gè)無(wú)窮大的隊(duì)列免胃,可以無(wú)限存放任務(wù)
2、如果使用的是有界隊(duì)列比如 ArrayBlockingQueue惫撰,任務(wù)首先會(huì)被添加到
ArrayBlockingQueue 中羔沙,ArrayBlockingQueue 滿了,會(huì)根據(jù)
maximumPoolSize 的值增加線程數(shù)量厨钻,如果增加了線程數(shù)量還是處理不過(guò)來(lái)扼雏,
ArrayBlockingQueue 繼續(xù)滿,那么則會(huì)使用拒絕策略
RejectedExecutionHandler 處理滿了的任務(wù)夯膀,默認(rèn)是 AbortPolicy
四種線程池
- newCachedThreadPool,是一種線程數(shù)量不定的線程池诗充,并且其最大線程數(shù)為Integer.MAX_VALUE,這個(gè)數(shù)是很大的诱建,一個(gè)可緩存線程池蝴蜓,如果線程池長(zhǎng)度超過(guò)處理需要,可靈活回收空閑線程俺猿,若無(wú)可回收茎匠,則新建線程。但是線程池中的空閑線程都有超時(shí)限制押袍,這個(gè)超時(shí)時(shí)長(zhǎng)是60秒诵冒,超過(guò)60秒閑置線程就會(huì)被回收。調(diào)用execute將重用以前構(gòu)造的線程(如果線程可用)谊惭。這類(lèi)線程池比較適合執(zhí)行大量的耗時(shí)較少的任務(wù)汽馋,當(dāng)整個(gè)線程池都處于閑置狀態(tài)時(shí)否过,線程池中的線程都會(huì)超時(shí)被停止。
- newFixedThreadPool,創(chuàng)建一個(gè)指定工作線程數(shù)量的線程池惭蟋,每當(dāng)提交一個(gè)任務(wù)就創(chuàng)建一個(gè)工作線程苗桂,當(dāng)線程 處于空閑狀態(tài)時(shí),它們并不會(huì)被回收告组,除非線程池被關(guān)閉了煤伟,如果工作線程數(shù)量達(dá)到線程池初始的最大數(shù),則將提交的任務(wù)存入到池隊(duì)列(沒(méi)有大小限制)中木缝。由于newFixedThreadPool只有核心線程并且這些核心線程不會(huì)被回收便锨,這樣它更加快速底相應(yīng)外界的請(qǐng)求。
- newScheduledThreadPool,創(chuàng)建一個(gè)線程池我碟,它的核心線程數(shù)量是固定的放案,而非核心線程數(shù)是沒(méi)有限制的,并且當(dāng)非核心線程閑置時(shí)會(huì)被立即回收矫俺,它可安排給定延遲后運(yùn)行命令或者定期地執(zhí)行吱殉。這類(lèi)線程池主要用于執(zhí)行定時(shí)任務(wù)和具有固定周期的重復(fù)任務(wù)。
public class PoolExecutorTest {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
//設(shè)置池中核心數(shù)量是2
ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);
System.out.println("現(xiàn)在的時(shí)間:"+System.currentTimeMillis());
mScheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("現(xiàn)在的時(shí)間:"+System.currentTimeMillis());
}
}, 4, TimeUnit.SECONDS);//這里設(shè)置延遲4秒執(zhí)行
}
}
- newSingleThreadExecutor這類(lèi)線程池內(nèi)部只有一個(gè)核心線程厘托,以無(wú)界隊(duì)列方式來(lái)執(zhí)行該線程友雳,這使得這些任務(wù)之間不需要處理線程同步的問(wèn)題,它確保所有的任務(wù)都在同一個(gè)線程中按順序中執(zhí)行铅匹,并且可以在任意給定的時(shí)間不會(huì)有多個(gè)線程是活動(dòng)的押赊。