1灿椅、如何合理地選擇或者配置
CachedThreadPool用于并發(fā)執(zhí)行大量短期的小任務(wù)套蒂,或者是負(fù)載較輕的服務(wù)器。
FixedThreadPool 用于負(fù)載比較重的服務(wù)器茫蛹,為了資源的合理利用操刀,需要限制當(dāng)前線(xiàn)程數(shù)量。
SingleThreadExecutor 用于串行執(zhí)行任務(wù)的場(chǎng)景麻惶,每個(gè)任務(wù)必須按順序執(zhí)行,不需要并發(fā)執(zhí)行信夫。
ScheduledThreadPoolExecutor 用于需要多個(gè)后臺(tái)線(xiàn)程執(zhí)行周期任務(wù)窃蹋,同時(shí)需要限制線(xiàn)程數(shù)量的場(chǎng)景。
2静稻、Executor 中submit 和execute區(qū)別
execute和submit的區(qū)別在于submit會(huì)返回Future來(lái)獲取任何執(zhí)行的結(jié)果, submit方便Exception處理警没。
3、一般根據(jù)任務(wù)類(lèi)型進(jìn)行區(qū)分, 假設(shè)CPU為N核
CPU密集型任務(wù)需要減少線(xiàn)程數(shù)量, 降低線(xiàn)程之間切換造成的開(kāi)銷(xiāo), 可配置線(xiàn)程池大小為N + 1.
IO密集型任務(wù)則可以加大線(xiàn)程數(shù)量, 可配置線(xiàn)程池大小為 N * 2.
混合型任務(wù)則可以拆分為CPU密集型與IO密集型, 獨(dú)立配置.
4振湾、保存待執(zhí)行任務(wù)的阻塞隊(duì)列
ArrayBlockingQueue:基于數(shù)組杀迹、有界,按 FIFO(先進(jìn)先出)原則對(duì)元素進(jìn)行排序
LinkedBlockingQueue:基于鏈表押搪,按FIFO (先進(jìn)先出) 排序元素
吞吐量通常要高于 ArrayBlockingQueue
Executors.newFixedThreadPool() 使用了這個(gè)隊(duì)列
SynchronousQueue:不存儲(chǔ)元素的阻塞隊(duì)列
每個(gè)插入操作必須等到另一個(gè)線(xiàn)程調(diào)用移除操作树酪,否則插入操作一直處于阻塞狀態(tài)
吞吐量通常要高于 LinkedBlockingQueue
Executors.newCachedThreadPool使用了這個(gè)隊(duì)列
PriorityBlockingQueue:具有優(yōu)先級(jí)的、無(wú)限阻塞隊(duì)列
5大州、隊(duì)列飽和策略
CallerRunsPolicy:只要線(xiàn)程池沒(méi)關(guān)閉续语,就直接用調(diào)用者所在線(xiàn)程來(lái)運(yùn)行任務(wù)
AbortPolicy:直接拋出 RejectedExecutionException 異常
DiscardPolicy:悄悄把任務(wù)放生,不做了
DiscardOldestPolicy:把隊(duì)列里待最久的那個(gè)任務(wù)扔了厦画,然后再調(diào)用 execute() 試試看能行不,我們也可以實(shí)現(xiàn)自己的 RejectedExecutionHandler 接口自定義策略疮茄,比如記錄日志