2012-04-30 39 views
1

我剛剛通過ThreadPoolExecutor的源代碼發現,一旦時間達到keepAliveTime的設置值並且allowCoreThreadTimeOut爲true,它將中斷所有閒置的工作人員。ThreadPoolExecutor如何中斷空閒線程?

這是一個有點陌生,我只能調用中斷方法時runState> = SHUTDOWN:

下面的代碼是從方法的ThreadPoolExecutorgetTask()

Runnable getTask() { 
... 
if (workerCanExit()) { 
    if (runState >= SHUTDOWN) // Wake up others 
     interruptIdleWorkers(); 
    return null; 
    } 
} 

是否意味着所有的空閒線程只能(或終止SHUTDOWN,STOP)中斷時runState> = SHUTDOWN?也就是說,狀態爲RUNNING時,它們不會中斷。

回答

2

你說得對。調用ThreadPoolExecutor中的getTask()方法獲取工作線程運行的下一個任務。該代碼塊僅在方法調用未識別出任何可執行任務執行時才執行。所以,如果沒有發現執行,它必須檢查關閉狀態。

workerCanExit()

檢查是否失敗得到一個任務可以退出工作線程Java文檔。如果池正在停止,或者隊列爲空,或者至少有一個線程處理可能非空隊列,即使允許核心超時,我們也允許工作線程死掉。

+0

我認爲runState是ThreadPoolExecutor的狀態。它只能通過關機方式進行更改。例如我創建了一個ThreadPoolExecutor,核心池大小爲10,maxmun池大小爲100,keepAliveTime爲1分鐘。我爲執行者提供了100個任務,以使其池大小達到100.在一定時間之後。完成100個任務中的50個。這意味着50個線程現在處於空閒狀態。但runState正在運行。這些空閒線程會在1分鐘後結束嗎? – Jacky

+0

@Jacky;不,它們不會,它定義了空閒線程等待工作的時間。當存在多於'corePoolSize'或'allowCoreThreadTimeOut'時,線程使用此超時。否則,他們會永遠等待新的工作。在示例中爲 –

+0

,corePoolSize爲10,低於100.當50個工作人員在工作時,任務隊列爲空。爲什麼不能退出50個空閒線程,因爲我們allowCoreThreadTimeOut? – Jacky

0

沒錯。一個正確的任務(如果允許中斷)必須檢查自身是否有中斷標誌並終止(即從run()返回)。