2009-10-13 26 views
21

我正在使用java中的Executors來同時併發運行更多的線程。 我有一套Runnable對象,我把它分配給Exceutors.The Executor工作正常 和一切都很好。但所有的任務在池中執行後,Java程序沒有終止,我認爲執行程序需要一些時間來殺死線程。任何人都可以幫助我減少執行器執行所有任務後所花費的時間。如何停止執行Java中的Executor ThreadPool?

回答

22

ExecutorService類有2種方法只是爲此:shutdown()shutdownNow()

使用shutdown()方法後,您可以調用awaitTermination()以阻止所有已啓動的任務完成。您甚至可以提供超時以防止永久等待。

您可能需要點擊我提供的部分鏈接。他們直接去找你可以自己閱讀這些東西的文檔。

+0

我如何確保所有任務都已提交,我需要所有任務都應該執行 – Rajapandian

+1

@Rajapandian關閉的定義是它等待所有任務完成,但不允許新任務開始。這不是你想要的嗎? –

+1

請任何人告訴我爲什麼我的java程序需要時間來停止執行,即使執行器完成所有任務後。 – Rajapandian

9

executor.shutdown()with awaitTermination(timeout)不會終止線程。 (即),如果您的可運行任務位於輪詢循環內部,它不會終止任務。它所做的只是在超時達到時中斷它的可運行任務。所以,在你運行的類的代碼,如果你等待的一些條件,你可能要更改的條件爲,

while (flagcondition && !Thread.currentThread().isInterrupted()) {} 

這可確保當作爲while循環結束線程被中斷的任務停止。或者,您可能希望捕獲中斷的異常,並在catch塊中設置flag = false來終止線程。

try { 
    // do some stuff and perform a wait that might throw an InterruptedException 
} catch (InterruptedException e) { 
    flagcondition = false; 
} 

您可能還想使用探查器來檢查爲什麼有些線程還沒有完成。