簡體   English   中英

奇怪的 Java 線程池行為 - 丟失任務,除非使用 Futures

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM