2012-04-10 101 views
1

我正在創建一個線程池,因爲我不需要從我的線程輸出任何信息,所以我沒有使用期貨&Callables。但問題是,如果我不使用Futures,我看到threadpool正在丟失我提交的任務。奇怪的Java線程池行爲 - 失去任務,除非使用期貨

這裏是一個被失去任務 -

while(hasWorkToDo){ 
ThreadPoolExecutor.execute(new Worker()); 
System.out.println("Work submitted"); 
} 

內,工人的()我的代碼結構,我在打印的run()執行的第一行「有工作」。

當我運行上面的代碼時,「獲得工作」的數量總是少於「工作提交」。

但是,當我改變我的代碼結構如下─

ArrayList<Future<String>> list = new ArrayList<Future<String>>(); 
while(hasWorkToDo){ 
Future<String> submit=ThreadPoolExecutor.submit(new Worker()); 
list.add(submit) 
} 

for (Future<String> f : list) { 
f.get(); 
} 

然後我看到很多次「有工作」等於「工作提交了」

這使我相信,除非我使用期貨&可調參數,線程池正在使用我正在提交的任務。

你以前見過這種行爲嗎?有沒有更好的方法來調試呢?

回答

0

你不需要保留未來的任務,減少你需要等到他們完成關閉執行者之前。我懷疑你在某處使用shutdownNow()。嘗試使用shutdown()代替。

+1

我已經關機()在錯誤的地方 – user837208 2012-04-11 08:01:50

0

A ThreadPoolExecutor可能會拒絕任務,如果它已關閉或已達到其容量。您可以使用setRejectedExectutionHandler來測試任務是否被拒絕。