ThreadPoolExecutor中的keepAliveTime详解
文章目錄
- 一、keepAliveTime的概念
- 二、keepAliveTime的設(shè)置方法
- 2.1. 通過構(gòu)造函數(shù)設(shè)置
- 2.2. 通過setKeepAliveTime方法動(dòng)態(tài)設(shè)置
- 三、線程是如何根據(jù)keepAliveTime進(jìn)行銷毀的
閱讀這篇文章,你將會(huì)知道:
keepAliveTime的概念。
keepAliveTime是如何設(shè)置的。
線程是如何根據(jù)keepAliveTime進(jìn)行銷毀的。
一、keepAliveTime的概念
- 1 keepAliveTime的單位是納秒,即1s=1000000000ns,1秒等于10億納秒。
- 2 keepAliveTime是線程池中空閑線程等待工作的超時(shí)時(shí)間。
- 3 當(dāng)線程池中線程數(shù)量大于corePoolSize(核心線程數(shù)量)或設(shè)置了allowCoreThreadTimeOut(是否允許空閑核心線程超時(shí))時(shí),線程會(huì)根據(jù)- 1 keepAliveTime的值進(jìn)行活性檢查,一旦超時(shí)便銷毀線程。
- 4 否則,線程會(huì)永遠(yuǎn)等待新的工作。
二、keepAliveTime的設(shè)置方法
2.1. 通過構(gòu)造函數(shù)設(shè)置
通過 keepAliveTime 、unit共同決定實(shí)際的 keepAliveTime值,最終會(huì)轉(zhuǎn)化成納秒單位。
2.2. 通過setKeepAliveTime方法動(dòng)態(tài)設(shè)置
重新設(shè)置線程池的keepAliveTime屬性,如果發(fā)現(xiàn)將要設(shè)置的值比原來的keepAliveTime值要小(即減小keepAliveTime),則觸發(fā)interruptIdleWorkers(),中斷空閑線程。
interruptIdleWorkers()是怎么中斷線程的呢?
(1)interruptIdleWorkers先拿出所有的工作者進(jìn)行遍歷,判斷工作者對(duì)應(yīng)的線程是否已經(jīng)中斷。
(2)如果沒有產(chǎn)生中斷,則判斷是否可以獲得鎖,如果能獲得鎖,則代表是空閑線程,然后中斷該線程。
(3)至于線程的中斷在什么時(shí)候會(huì)拋出中斷異常,同學(xué)們可以自己找下資料,也可以參考下別人寫的這篇文章Java并發(fā)之線程中斷
三、線程是如何根據(jù)keepAliveTime進(jìn)行銷毀的
-
1.線程池中的線程通過工作者(Worker)這個(gè)類進(jìn)行包裝,Worker通過 ThreadPoolExecutor.runWorker() 這個(gè)方法進(jìn)行自旋,從隊(duì)列中獲得task,并完成工作。
-
2.如果拿不到task(即firstTask == null 或 getTask() == null),則會(huì)退出自旋,進(jìn)入finally代碼塊。finally中會(huì)調(diào)用processWorkerExit方法,注銷當(dāng)前Worker,實(shí)現(xiàn)worker的銷毀。對(duì)keepAliveTime的使用,就在getTask()方法中,這個(gè)在后面講解。
-
3.getTask 怎么使用 keepAliveTime
(1)首先也是一個(gè)自旋,當(dāng)allowCoreThreadTimeout(運(yùn)行空閑核心線程超時(shí)) 或 wc>corePoolSize(當(dāng)前線程數(shù)量大于核心線程數(shù)量) 時(shí),timed會(huì)標(biāo)識(shí)為true,表示需要進(jìn)行超時(shí)判斷。
(2)當(dāng)wc(當(dāng)前工作者數(shù)量)大于 最大線程數(shù) 或 空閑線程的空閑時(shí)間大于keepAliveTime(timed && timeout),以及wc>1或(workQueue)任務(wù)隊(duì)列為空時(shí),會(huì)進(jìn)入compareAndDecrementWorkerCount方法,對(duì)wc的值減1。
(3)當(dāng)compareAndDecrementWorkerCount方法返回true時(shí),則getTask方法會(huì)返回null,終止getTask方法的自旋。這時(shí)候回到runWorker方法,就會(huì)進(jìn)入到processWorkerExit方法,進(jìn)行銷毀worker。
-
4.compareAndDecrementWorkerCount中操作的是ctl屬性:
(1)ctl是中心控制器,一個(gè)AtomicInteger類型的整數(shù),通過數(shù)字的二進(jìn)制編碼的位進(jìn)行分段,不同的二進(jìn)制位段表示有不同的含義。
(2)在ctl中,低29為表示線程池的容量,即線程池最大容量為 536870911 = 000 11111111111111111111111111111。
總結(jié)
以上是生活随笔為你收集整理的ThreadPoolExecutor中的keepAliveTime详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在线安装docker
- 下一篇: Spring Schema整合Quart