作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个线程池,并且由于我不需要线程的任何输出,因此我没有使用 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/
我是一名优秀的程序员,十分优秀!