【40期】說一下線程池內(nèi)部工作原理
閱讀本文大概需要 3 分鐘。
來自:cnblogs.com/qingquanzi/p/8146638.html
一、線程池創(chuàng)建

corePoolSize:線程池的核心線程數(shù),說白了就是,即便是線程池里沒有任何任務(wù),也會有corePoolSize個線程在候著等任務(wù)。
maximumPoolSize:最大線程數(shù),不管你提交多少任務(wù),線程池里最多工作線程數(shù)就是maximumPoolSize。
keepAliveTime:線程的存活時間。當(dāng)線程池里的線程數(shù)大于corePoolSize時,如果等了keepAliveTime時長還沒有任務(wù)可執(zhí)行,則線程退出。
unit:這個用來指定keepAliveTime的單位,比如秒:TimeUnit.SECONDS。
workQueue:一個阻塞隊列,提交的任務(wù)將會被放到這個隊列里。
threadFactory:線程工廠,用來創(chuàng)建線程,主要是為了給線程起名字,默認(rèn)工廠的線程名字:pool-1-thread-3。
handler:拒絕策略,當(dāng)線程池里線程被耗盡,且隊列也滿了的時候會調(diào)用。
二、線程池執(zhí)行流程

1、先看一下線程池的executor方法

判斷當(dāng)前活躍線程數(shù)是否小于corePoolSize,如果小于,則調(diào)用addWorker創(chuàng)建線程執(zhí)行任務(wù)
如果不小于corePoolSize,則將任務(wù)添加到workQueue隊列。
如果放入workQueue失敗,則創(chuàng)建線程執(zhí)行任務(wù),如果這時創(chuàng)建線程失敗(當(dāng)前線程數(shù)不小于maximumPoolSize時),就會調(diào)用reject(內(nèi)部調(diào)用handler)拒絕接受任務(wù)。
2、再看下addWorker的方法實現(xiàn)


創(chuàng)建Worker對象,同時也會實例化一個Thread對象。
啟動啟動這個線程
3、再到Worker里看看其實現(xiàn)

4、接下來咱們看看runWorker方法的邏輯

5、最后在看看getTask方法實現(xiàn)

咱們先不管allowCoreThreadTimeOut,這個變量默認(rèn)值是false。wc>corePoolSize則是判斷當(dāng)前線程數(shù)是否大于corePoolSize。
如果當(dāng)前線程數(shù)大于corePoolSize,則會調(diào)用workQueue的poll方法獲取任務(wù),超時時間是keepAliveTime。如果超過keepAliveTime時長,poll返回了null,上邊提到的while循序就會退出,線程也就執(zhí)行完了。
推薦閱讀:
【37期】請你詳細(xì)說說類加載流程,類加載機制及自定義類加載器

長按二維碼,添加我微信
朕已閱?

