Java ExecutorService invokeAll()复制被调用的可调用对象

Java ExecutorService invokeAll()复制被调用的可调用对象,java,multithreading,duplicates,executorservice,executor,Java,Multithreading,Duplicates,Executorservice,Executor,尝试从fixedThreadPool调用可调用项列表时出现问题。虽然所有可调用项都将执行,但其中一些似乎同时被分派到不同的线程,因此实际上它们被多次调用。请参阅下面的代码: try { ExecutorService es = Executors.newFixedThreadPool(Environment.nThreads); es.invokeAll(Environment.jobPool); es.shutdown(); } catch (InterruptedEx

尝试从fixedThreadPool调用可调用项列表时出现问题。虽然所有可调用项都将执行,但其中一些似乎同时被分派到不同的线程,因此实际上它们被多次调用。请参阅下面的代码:

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

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

如果可调用抛出未捕获的异常,则行为未定义。例如,对于ExecutorService中的中断异常。另外,由于incokeAll接受一个集合,所以从ArrayList中构建一个HashSet并传递它,以确保没有任何重复的内容

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

我很确定ExecutorService不会只调用同一个Callable两次。

您确定没有将同一个任务多次添加到传递给ExecutorService的集合中吗?另外,您确定您的任务在运行期间都不会抛出异常吗?很难想象问题出在这段代码中。如何构造Environment.jobbool?这是一段创建jobbool的代码,公共静态final ArrayList jobbool=new ArrayList;这是添加作业的位置:Environment.jobPool.addExecutors.callablenew Jobeval,validator@Andrei我不知道即使在抛出异常时如何调用callable两次。我不认为他们会这样做,因为我倾向于在控制台中打印所有异常。