1 new Thread 弊端
&? 每次new Thread新建對象此洲,性能差
& 線程缺乏統(tǒng)一管理缩擂,可能無限制的新建線程,相互競爭,有可能占用過多系統(tǒng)資源導(dǎo)致死機(jī)或OOM
& 缺少更多功能偏灿,如更多執(zhí)行,定期執(zhí)行备典,線程中斷
2 線程池的好處
1 如果線程池中的線程數(shù)量小于corePoolSize中的數(shù)量诫欠,直接創(chuàng)建新的線程處理任務(wù),
2? ? ?corePoolSize < 當(dāng)前線程的數(shù)量<maxImumPoolSize莱褒, 只有當(dāng)workQueue滿的時候才去創(chuàng)建新的線程去處理任務(wù)
1)
if(corePoolSize ==maxImumPoolSize)&&(workQueue未滿的時候)
把請求放到workQueue里面击困,等待有空閑的線程從workQueue取出任務(wù)
2)
if(maxImumPoolSize滿了)&&(workQueue滿的時候)
通過拒絕策略去執(zhí)行
workQueue?
保持等待任務(wù)的阻塞隊列,提交新的任務(wù)到線程池以后广凸,會根據(jù)當(dāng)前線程池中正在運(yùn)行的線程數(shù)量來決定處理方式
1 直接切換 無界隊列 或者有界隊列
直接隊列:SynchronousQueue? ?
無界隊列:基于鏈表的隊列 LinkedBlockingQueue阅茶,能夠創(chuàng)建的最大線程數(shù)目為corePoolSize??maxImumPoolSize 不起作用了,當(dāng)corePoolSize? 數(shù)目的線程都在運(yùn)行的時候谅海,新的線程就會放到等待隊列中去
有界隊列:使用的是ArrayBlockingQueue 實(shí)現(xiàn)的脸哀,可以將線程的最大數(shù)目限制為maximumPoolSize,線程池對線程的調(diào)度更困難,減少了系統(tǒng)的資源消耗? 線程池和隊列的大小都是有限的
降低系統(tǒng)消耗:設(shè)置較大的隊列容量扭吁,較小的線程池容量
提交的任務(wù)經(jīng)常阻塞:可以設(shè)置最大線程數(shù)
線程池數(shù)目設(shè)置過大會導(dǎo)致并發(fā)量增加撞蜂,需要考慮線程之間的調(diào)度
線程池設(shè)置大一點(diǎn) 提高CPU利用率盲镶,
2? KeepAliveTime:線程沒有任務(wù)執(zhí)行時最多保持多久時間終止,當(dāng)線程池中線程大于corePoolSize 時候谅摄,線程保持的時間
workQueue 對應(yīng)的阻塞隊列滿了的時候徒河,并且沒有空閑的線程池,這時候繼續(xù)提交任務(wù)的時候送漠,需要采取一種策略來處理這個任務(wù)顽照,線程池提供了四種策略
(1,直接拋出異常
2 用調(diào)用者的線程來執(zhí)行任務(wù)
3? 丟棄隊列中最考前的任務(wù),并執(zhí)行當(dāng)前任務(wù)
4 直接丟棄這個任務(wù) )
9.2? 線程池的狀態(tài)
Executor 框架:根據(jù)一組策略的調(diào)用調(diào)度一種異步的框架闽寡,將任務(wù)提交和任務(wù)運(yùn)行分離的分離的機(jī)制
JUC中有三個Executor?接口:? Executor??ExecutorService SchedukedExecutorService
ThreadPoolExecutor 是功能最強(qiáng)的接口代兵,根據(jù)需要傳入?yún)?shù)和策略
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Executor 框架接口
&&&&? Executors.newCachedThreadPool? 命名新的線程池? 創(chuàng)建可緩存的線程池,如果線程池長度超過了處理的需要可以靈活的回收爷狈,如果沒有就創(chuàng)建新的線程池
&&&&?Executors.newFixedThreadPool 創(chuàng)建的是一種定長的線程池植影,可以控制線程最大的并發(fā)數(shù),超出的線程需要等待
&&&&??Executors.newScheduledThreadPool 創(chuàng)建的也是定長的線程池,支持定時和周期任務(wù)的執(zhí)行
&&&&?Executors.newSingleThreadExecutor 創(chuàng)建的是一個單線程化的線程池涎永,只會用唯一的線程任務(wù)來執(zhí)行思币,保證所有任務(wù)按照指令順序去執(zhí)行(優(yōu)先級,先入先出