2012-03-05 312 views
0

尝试从fixedThreadPool调用可调用列表时遇到问题。虽然所有可调用的命令都会执行,但其中一些可能同时被分派到不同的线程,因此它们实际上被称为不止一次。请参见下面的代码:ExecutorService invokeAll()重复被调用的Callable

try { 
    ExecutorService es = Executors.newFixedThreadPool(Environment.nThreads); 
    es.invokeAll(Environment.jobPool); 
    es.shutdown(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+1

您确定您没有将相同任务添加到您传递给ExecutorService的集合多次?你也确定你的任务在运行期间没有任何异常吗? – 2012-03-05 12:26:12

+3

很难想象这个问题出在这段代码中。 “Environment.jobPool”是如何构建的? – 2012-03-05 12:27:42

+0

这是创建jobPool的代码片段 public static final ArrayList > jobPool = new ArrayList >(); 这是作业被添加到它的位置: Environment.jobPool.add(Executors.callable(new Job(eval,validator))); @Andrei我不明白如何调用一个可调用对象,即使在抛出异常时也会调用两次。我不认为他们做了,因为我倾向于在控制台中打印所有异常。 – Renaud 2012-03-05 21:09:40

回答

0

你可能有重复你的一些Callable任务列表。尝试使用java.util.Set正确实施每个Callable实现的equal方法。

0

如果Callable引发未捕获的异常,则行为未定义。例如,对于中断异常来停止ExecutorService。此外,由于incokeAll接受一个集合,打造一个HashSet出你的ArrayList并将它传递只是为了确保你没有什么重复

Set<?> set = new HashSet<?>(jobPool); 

我敢肯定的ExecutorService的不只是调用相同的Callable两次。

相关问题