【问题标题】:How can I use ExecutorService to get results of all the tasks submitted?如何使用 ExecutorService 获取所有提交任务的结果?
【发布时间】:2018-02-07 21:28:58
【问题描述】:

我有一个要求,我必须为 5 个任务启动 5 个线程,并且要完成任务有一个特定的超时时间。超时后,我想要所有任务的结果。我该如何使用 ExecutorService 呢? 根据我对 ExecutorService 的阅读,我得出结论,我需要一些类似的东西:

List<Future> futures = new ArrayList<Future>();
futures.addAll(executor.submit(new someCallable()));
try {
    if (!executorService.awaitTermination(30*1000, TimeUnit.MILLISECONDS)) {
        executorService.shutdownNow();
    } 
} catch (InterruptedException e) {
    executorService.shutdownNow();
}

我应该做一个future.get() 吗?中断/不完整线程的结果如何?我对这部分感到困惑。 如果线程失败,我想将它们的状态字段标记为失败,如果线程成功,我想将它们标记为成功。

【问题讨论】:

  • 在您的情况下,您希望如何处理失败或未及时完成的​​任务?忽视?整件事都失败了?
  • @KennedyOliveira :如果线程失败,我想将它们的状态字段标记为失败,如果线程成功,我想将它们标记为成功。
  • 我认为这可以docs.oracle.com/javase/8/docs/api/java/util/concurrent/… 可以很好地解决 - 可以假设“失败”仅意味着任务花费了太长时间(而不是内部线程被中断或抛出异常)?

标签: java multithreading concurrency future executorservice


【解决方案1】:

您可以只使用 ExecutorService 中的 invokeAll 并指定超时 - API

【讨论】:

    【解决方案2】:

    超时后我想要所有任务的结果。我该如何使用 ExecutorService 呢?

    我建议使用Callable

    一个任务返回一个结果并可能抛出异常。实施者 定义一个没有参数的方法调用。

    因此,当您覆盖 call 方法时,您要么返回一些状态,要么只是抛出异常失败的情况。然后,稍后使用

    future.get()
    

    遍历所有提交的任务并获取它们的状态,因此您可以更新状态以进行进一步处理。

    【讨论】:

    • 是的,但是你如何将未来和任务联系起来。 IE。您如何将哪个未来与哪个任务联系起来?
    • @tejas 你是什么意思?当你迭代future时,你会得到每个线程的结果。
    • 有时如果有cancellationException 或InterruptedException 那么在这种情况下future.get 不存在。
    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2011-03-17
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多