我正在创建一个线程池,因为我不需要线程的任何输出,所以我没有使用 Futures&Callables。但问题是,如果我不使用 Futures,我会看到线程池正在丢失我正在提交的任务。
这是我失去任务的代码结构-
while(hasWorkToDo){
ThreadPoolExecutor.execute(new Worker());
System.out.println("Work submitted");
}
在 Worker() 中,我在 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();
}
然后我看到“得到工作”的次数等于“提交的工作”
这让我相信,除非我使用 Futures&Callables,否则线程池正在使用我正在提交的任务。
你以前见过这样的行为吗?有没有更好的方法来调试这个?