ExecutorService invokeAll()重复调用Callable

时间:2012-03-05 12:21:47

标签: java multithreading duplicates executorservice executor

尝试从fixedThreadPool调用callables列表时遇到问题。虽然所有的callables都会执行,但其中一些似乎同时被分派到不同的线程,所以实际上它们不止一次被调用。请参阅以下代码:

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

2 个答案:

答案 0 :(得分:0)

您可能在列表中复制了一些Callable任务。尝试使用java.util.Set正确实施每个equal实施的Callable方法。

答案 1 :(得分:0)

如果Callable抛出未捕获的异常,则行为未定义。例如,对于停止ExecutorService的中断异常。此外,因为incokeAll接受一个Collection,所以从你的ArrayList中构建一个HashSet并传递它,以确保你没有任何重复的东西

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

我很确定ExecutorService不会只调用两次相同的Callable。