線程狀態(tài)
1. 新建
2. 可運行
3. 運行
4. 阻塞
5. 消亡
線程狀態(tài)轉(zhuǎn)換
線程池的執(zhí)行邏輯
核心概念:
corePoolSize
maxPoolSize
keepAliveTime:如果當(dāng)前線程池中線程數(shù)大于corePoolSize,
多余的線程辛燥,在等待keepAliveTime時間后如果還沒有新的線程任務(wù)指派給它瞎抛,它就會被回收
TimeUnit
workQueue
ArrayBlockingQueue:基于數(shù)組結(jié)構(gòu)的有界阻塞隊列唆铐,按FIFO排序任務(wù)碍岔;
LinkedBlockingQuene:基于鏈表結(jié)構(gòu)的阻塞隊列竿音,按FIFO排序任務(wù)拒迅,吞吐量通常要高于
SynchronousQuene:一個不存儲元素的阻塞隊列施符,每個插入操作必須等到另一個線程調(diào)用移除操作甲馋,否則插入操作一直處于阻塞狀態(tài)养泡,吞吐量通常要高于ArrayBlockingQuene嗜湃;
PriorityBlockingQuene:具有優(yōu)先級的無界阻塞隊列;
threadFactory
RejectExecutionHandler: 拒絕策略
ThreadPoolExecutor.AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常澜掩。
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務(wù)购披,但是不拋出異常。
ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務(wù)肩榕,然后重新嘗試執(zhí)行任務(wù)(重復(fù)此過程)
ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程處理該任務(wù)
當(dāng)然也可以根據(jù)應(yīng)用場景實現(xiàn)RejectedExecutionHandler接口刚陡,
自定義飽和策略,如記錄日志或持久化存儲不能處理的任務(wù)株汉。
執(zhí)行邏輯
1. 當(dāng)提交一個任務(wù)時筐乳,線程池創(chuàng)建一個新線程執(zhí)行任務(wù),直到當(dāng)前線程數(shù)等于corePoolSize
2. 如果當(dāng)前線程數(shù)為corePoolSize郎逃,繼續(xù)提交的任務(wù)被保存到阻塞隊列中哥童,等待被執(zhí)行
3. 如果阻塞隊列滿了,那就創(chuàng)建新的線程執(zhí)行當(dāng)前任務(wù)褒翰;直到線程池中的線程數(shù)達到maxPoolSize
4. 這時再有任務(wù)來贮懈,只能執(zhí)行reject()處理該任務(wù)
image.png