[英]weird Java threadpool behavior - losing tasks unless Futures are used
我正在創建一個線程池,因為我的線程不需要任何 output,所以我沒有使用 Futures&Callables。 但問題是,如果我不使用 Futures,我會發現線程池正在丟失我正在提交的任務。
這是我正在丟失任務的代碼結構-
while(hasWorkToDo){
ThreadPoolExecutor.execute(new Worker());
System.out.println("Work submitted");
}
在 Worker() 中,我在 run() 實現的第一行打印“got work”。
當我運行上面的代碼時,“得到工作”的數量總是少於“提交的工作”。
但是,當我將代碼結構更改為以下時 -
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();
}
然后我看到“得到工作”的次數等於“提交的工作”
這讓我相信,除非我使用 Futures&Callables,否則線程池正在使用我提交的任務。
你以前見過這樣的行為嗎? 有沒有更好的方法來調試這個?
您不需要保留 Future 任務,更不用說在關閉執行程序之前等待它們完成。 我懷疑你在某處使用 shutdownNow() 。 嘗試改用 shutdown() 。
如果ThreadPoolExecutor
關閉或已達到其容量,它可能會拒絕任務。 您可以使用setRejectedExectutionHandler
來測試任務是否被拒絕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.