尝试从fixedThreadPool
调用callables列表时遇到问题。虽然所有的callables都会执行,但其中一些似乎同时被分派到不同的线程,所以实际上它们不止一次被调用。请参阅以下代码:
try {
ExecutorService es = Executors.newFixedThreadPool(Environment.nThreads);
es.invokeAll(Environment.jobPool);
es.shutdown();
} catch (InterruptedException e) {
e.printStackTrace();
}
答案 0 :(得分:0)
您可能在列表中复制了一些Callable
任务。尝试使用java.util.Set
正确实施每个equal
实施的Callable
方法。
答案 1 :(得分:0)
如果Callable抛出未捕获的异常,则行为未定义。例如,对于停止ExecutorService的中断异常。此外,因为incokeAll接受一个Collection,所以从你的ArrayList中构建一个HashSet并传递它,以确保你没有任何重复的东西
Set<?> set = new HashSet<?>(jobPool);
我很确定ExecutorService不会只调用两次相同的Callable。