我剛剛通過ThreadPoolExecutor
的源代碼發現,一旦時間達到keepAliveTime的設置值並且allowCoreThreadTimeOut爲true,它將中斷所有閒置的工作人員。ThreadPoolExecutor如何中斷空閒線程?
這是一個有點陌生,我只能調用中斷方法時runState> = SHUTDOWN:
下面的代碼是從方法的ThreadPoolExecutor
getTask()
。
Runnable getTask() {
...
if (workerCanExit()) {
if (runState >= SHUTDOWN) // Wake up others
interruptIdleWorkers();
return null;
}
}
是否意味着所有的空閒線程只能(或終止SHUTDOWN,STOP)中斷時runState> = SHUTDOWN?也就是說,狀態爲RUNNING時,它們不會中斷。
我認爲runState是ThreadPoolExecutor的狀態。它只能通過關機方式進行更改。例如我創建了一個ThreadPoolExecutor,核心池大小爲10,maxmun池大小爲100,keepAliveTime爲1分鐘。我爲執行者提供了100個任務,以使其池大小達到100.在一定時間之後。完成100個任務中的50個。這意味着50個線程現在處於空閒狀態。但runState正在運行。這些空閒線程會在1分鐘後結束嗎? – Jacky
@Jacky;不,它們不會,它定義了空閒線程等待工作的時間。當存在多於'corePoolSize'或'allowCoreThreadTimeOut'時,線程使用此超時。否則,他們會永遠等待新的工作。在示例中爲 –
,corePoolSize爲10,低於100.當50個工作人員在工作時,任務隊列爲空。爲什麼不能退出50個空閒線程,因爲我們allowCoreThreadTimeOut? – Jacky