gpt4 book ai didi

java - 奇怪的 Java 线程池行为 - 除非使用 Future,否则会丢失任务

转载 作者:行者123 更新时间:2023-12-01 05:22:50 25 4
gpt4 key购买 nike

我正在创建一个线程池,并且由于我不需要线程的任何输出,因此我没有使用 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() 代替。

关于java - 奇怪的 Java 线程池行为 - 除非使用 Future,否则会丢失任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10089245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com