1

我正在创建一个线程池,因为我不需要线程的任何输出,所以我没有使用 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,否则线程池正在使用我正在提交的任务。

你以前见过这样的行为吗?有没有更好的方法来调试这个?

4

2 回答 2

0

您不需要保留 Future 任务,更少需要在关闭执行程序之前等待它们完成。我怀疑您正在某处使用 shutdownNow() 。尝试使用 shutdown() 代替。

于 2012-04-10T13:01:51.193 回答
0

ThreadPoolExecutor如果 A 已关闭或已达到其容量,则A可能会拒绝任务。您可以setRejectedExectutionHandler用来测试任务是否被拒绝。

于 2012-04-10T13:47:29.633 回答