2016-09-09 71 views
5

如果我有下面的代碼,它工作正常:Java ExecutorService - 如果awaitTermination()失敗會怎麼樣?

ExecutorService service = Executors.newFixedThreadPool(100); 

[....] 

List<Future<SomeObject>> futures = service.invokeAll(callables); 
for (Future f : futures) { 
    f.get(); 
} 

// shutdown the service after all Callables are finished. 
service.shutdown(); 

boolean serviceIsShutDown = service.awaitTermination(5, TimeUnit.SECONDS); 
if (serviceIsShutDown) { 
    System.out.println("Service terminated normally. All ok."); 
} else { 
    // What if it's not shutDown? 
    [...] 
    // this? 
    //service = null; 
} 

問題:如果呼叫

boolean serviceIsShutDown = service.awaitTermination(5, TimeUnit.SECONDS); 

返回false,因爲超時命中?

我猜ExecutorService中的線程將保持WAIT狀態。什麼是最好的解決方案? 將服務設置爲null並讓GarbageCollector刪除它?但是相關的線程會發生什麼?由於還有參考資料,它會不會被垃圾收集?

該代碼通常有效,但只是好奇。如果返回false,該怎麼辦?

+1

取決於你想要做什麼。你可以試着用.shutdown()強制關機,或者用shutdownNow()關機。 – jordaniac89

+1

您好Joschi,您已經按照這篇文章改變了關機邏輯:http://stackoverflow.com/questions/4958330/java- executorservice-awaittermination-of-all-recursively-created-tasks/39295555#39295555 –

+0

嗨,謝謝大家的回答! – Joschi

回答

1

如果awaitTermination()回報false在例如,您可以選擇嘗試撥打shutdownNow()。此方法將盡最大努力取消所有仍在執行的任務,但它不能保證。一些執行不力的任務可能沒有取消政策,只能永遠運行。在這種情況下,線程永遠不會被終止,並且執行程序永遠不會被垃圾收集。

這樣的任務也將阻止你的程序正常終止(如果你不把你的工作線程標記爲守護進程)。例如,如果你的任務只包含一個空的無限循環,即使你致電shutdownNow(),它也不會被取消。

也有可能是任務沒有適當的取消策略,並且運行時間過長(但不是永遠)。例如,它有一個非常非常長的空循環。您可能無法通過shutdown()/shutdownNow()關閉正在執行此任務的池,但它遲早會完成其工作,線程將隨執行程序一起終止。

+0

謝謝你的回答和詳細的解釋! – Joschi

2

如果你想 「逼」 你的ExecutorService終止只需使用:

shutdownNow時()

看看這裏的介紹:

enter image description here

+0

謝謝你的回答!我會試一試 – Joschi

相關問題