當(dāng)任務(wù)提交給ThreadPoolExecutor 線程池中
- 先檢查核心線程數(shù)是否已經(jīng)全部使用肢簿,如果沒(méi)有交由核心線程去執(zhí)行任務(wù)
- 如果核心線程數(shù)已經(jīng)全部占用幢尚,則將任務(wù)添加到隊(duì)列里面
- 如果隊(duì)列已經(jīng)占滿或链,比較當(dāng)前線程池的中線程的數(shù)量是不是與超過(guò)maximumPoolSize
- 如果沒(méi)有查過(guò)則創(chuàng)建線程去執(zhí)行念脯,也就是說(shuō)線程池最多可以接受多少任務(wù)呢派阱?就是maximumPoolSize+隊(duì)列的大小。
- 當(dāng)線程池中的線程的數(shù)量大于corePoolSize數(shù)量有空閑線程則執(zhí)行回收揩环,回收時(shí)間是keepAliveTime,單位是unit幅虑,都是初始化的時(shí)候設(shè)置的丰滑。
//三種阻塞隊(duì)列:
BlockingQueue<Runnable> workQueue = null;
workQueue = new ArrayBlockingQueue<>(5);//基于數(shù)組的先進(jìn)先出隊(duì)列,有界
workQueue = new LinkedBlockingQueue<>();//基于鏈表的先進(jìn)先出隊(duì)列倒庵,無(wú)界
workQueue = new SynchronousQueue<>();//無(wú)緩沖的等待隊(duì)列褒墨,無(wú)界
//四種拒絕策略:
RejectedExecutionHandler rejected = null;
rejected = new ThreadPoolExecutor.AbortPolicy();//默認(rèn),隊(duì)列滿了丟任務(wù)拋出異常
rejected = new ThreadPoolExecutor.DiscardPolicy();//隊(duì)列滿了丟任務(wù)不異常
rejected = new ThreadPoolExecutor.DiscardOldestPolicy();//將最早進(jìn)入隊(duì)列的任務(wù)刪擎宝,之后再嘗試加入隊(duì)列
rejected = new ThreadPoolExecutor.CallerRunsPolicy();//如果添加到線程池失敗郁妈,那么主線程會(huì)自己去執(zhí)行該任務(wù)
//五種線程池:
ExecutorService threadPool = null;
threadPool = Executors.newCachedThreadPool();//有緩沖的線程池,線程數(shù) JVM 控制
threadPool = Executors.newFixedThreadPool(3);//固定大小的線程池
threadPool = Executors.newScheduledThreadPool(2);
threadPool = Executors.newSingleThreadExecutor();//單線程的線程池绍申,只有一個(gè)線程在工作
threadPool = new ThreadPoolExecutor();//默認(rèn)線程池噩咪,可控制參數(shù)比較多
多線程編程基礎(chǔ)知識(shí):
/**
了解JDK Executors線程池嗎?
知道JDK提供了哪些默認(rèn)的實(shí)現(xiàn)嗎?
看過(guò)阿里巴巴java開(kāi)發(fā)手冊(cè)嗎极阅?知道為啥不允許使用默認(rèn)的實(shí)現(xiàn)嗎胃碾?
你們沒(méi)有用默認(rèn)的吧?那來(lái)介紹一下你們自定義線程池的幾個(gè)常用參數(shù)唄?
你這個(gè)幾個(gè)參數(shù)的值是怎么得來(lái)的呀筋搏?算出來(lái)的仆百?怎么算出來(lái)的?
線程池里面的任務(wù)是IO密集型的還是計(jì)算密集型的呢奔脐?
好俄周,現(xiàn)在我們有一個(gè)自定義線程池了吁讨,來(lái)說(shuō)一下你這個(gè)線程池的工作流程唄?
那你這個(gè)線程池滿了怎么辦呀峦朗?拒絕建丧?咋拒絕?有哪些拒絕策略呢甚垦?
別緊張,隨便說(shuō)兩個(gè)就行茶鹃。
*/