2012-04-10 18 views
1

我正在创建一个线程池,因为我不需要从我的线程输出任何信息,所以我没有使用期货&Callables。但问题是,如果我不使用Futures,我看到threadpool正在丢失我提交的任务。奇怪的Java线程池行为 - 失去任务,除非使用期货

这里是一个被失去任务 -

while(hasWorkToDo){ 
ThreadPoolExecutor.execute(new Worker()); 
System.out.println("Work submitted"); 
} 

内,工人的()我的代码结构,我在打印的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(); 
} 

然后我看到很多次“有工作”等于“工作提交了”

这使我相信,除非我使用期货&可调参数,线程池正在使用我正在提交的任务。

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

回答

0

你不需要保留未来的任务,减少你需要等到他们完成关闭执行者之前。我怀疑你在某处使用shutdownNow()。尝试使用shutdown()代替。

+1

我已经关机()在错误的地方 – user837208 2012-04-11 08:01:50

0

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