【问题标题】:ExecutorService invokeAll() duplicates Callable being calledExecutorService invokeAll() 重复 Callable 被调用
【发布时间】:2012-03-05 12:21:46
【问题描述】:

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

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

【问题讨论】:

  • 您确定没有多次向传递给 ExecutorService 的集合添加相同的任务吗?另外你确定你的任务在运行期间没有抛出异常吗?
  • 很难想象问题出在这段代码中。 Environment.jobPool是如何构造的?
  • 这是创建jobPool的一段代码 public static final ArrayList> jobPool = new ArrayList>();这是将作业添加到其中的位置: Environment.jobPool.add(Executors.callable(new Job(eval, validator))); @Andrei我看不到即使抛出异常也会调用两次可调用对象。我认为他们无论如何都不会这样做,因为我倾向于在控制台中打印所有异常。

标签: java multithreading duplicates executorservice executor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多