1

我是新來java執行器的東西。Java ServiceExecutor終止條件

我正在使用Java的ExecutorService來啓動幾個線程來處理數據。

Executor executor = Executors.newFixedThreadPool(poolSize); 

for(int i=0; i< 5;i++) executor.execute(new MyRunnable(i)); 

一旦線程沒有找到數據,他們正常終止。

我的問題是當所有線程終止時執行程序會發生什麼情況,它仍在運行其主線程?或者它會自行終止,整個應用程序將優雅地完成?

如果執行程序線程仍在運行,我怎麼能讓它在它的所有子線程完成後終止(poolSize線程數)。

回答

2

Executor將繼續在臥螺紋池下運行。您仍然可以執行或提交新任務。建議關閉Executor服務調用ExecutorService.html#shutdown(),它會嘗試停止所有正在執行的任務,暫停等待任務的處理,並返回正在等待執行的任務的列表。

您也可以使用ExecutorService.html#shutdownNow(),它停止所有正在執行的任務,暫停等待任務的處理並返回正在等待執行的任務的列表。當您需要立即關閉時,它非常有用。

+0

感謝Quoi無主線程。無論如何,我可以從MyRunnable線程類發送一些信號,說讓shutdownNow()執行器服務? – 2013-03-02 07:47:22

1

使用shutdown方法從接口ExecuterService正常關閉,因爲即使線程完成,Quoi仍然運行它。您可以隨時使用提交進行新工作。其他實用的方法是here

1

你能想到這樣的說法:

shutdown()只會讓執行者服務,它不能接受新的任務,但已經提交的任務繼續運行

shutdownNow()將執行相同的操作,並嘗試通過中斷相關的線程來取消已提交的任務。請注意,如果您的任務忽略中斷,則shutdownNow的行爲將與關機完全相同。

2

1)在一個固定的線程池執行線程永遠無法終止一旦開始

2)存在線程池執行

+0

好的。無論如何,一旦所有的工作線程完成處理,停止池? – 2013-03-02 07:42:49

+1

executor.shutdown()否則你的應用永遠不會結束 – 2013-03-02 08:02:06

+0

同意。這意味着我需要將執行程序對象傳遞給MyRunnable,然後從那裏關閉。希望這應該是正確的地方。 – 2013-03-02 08:39:18