【问题标题】:ExecutorService wait for all Future to completeExecutorService 等待所有 Future 完成
【发布时间】:2018-09-22 04:41:21
【问题描述】:

我有下面的 ExecutorService 代码。

try{
    ExecutorService executor = Executors.newFixedThreadPool(5);
    List<Callable<String>> taskList = new ArrayList<Callable<String>>(5);
    for(int i=1;i<=5;i++){
        taskList.add(new SimpleTask());
    }

    List<Future<String>> list =  executor.invokeAll(taskList);
    executor.shutdown();
    System.out.println(list.get(0).get());
    System.out.println("Exit");
}catch(Exception e){
    e.printStackTrace();
}

class SimpleTask implements Callable<String> {
    @Override
    public String call() throws Exception {     
        return new Date().toString();
    }
}

我想知道list.get(0).get()会等待所有任务完成吗?

【问题讨论】:

  • 不,它只会等待一个Future(第一个)完成
  • 正如袋熊所说,不。那么,您是在寻找方法来做到这一点还是回答了您的问题?
  • 我在 call() 中设置了断点并跳过第一个任务。然后也等待所有任务完成。
  • 如果你在call() 中设置了一个断点,你将不得不跳过它五次,因为这就是它被调用的频率。这听起来像是它在等待的原因。

标签: java executorservice


【解决方案1】:

不,代码不会等待每个任务完成。通过调用list.get(0).get(),您正在检索第一个可选调用get(),它将根据documentation 阻塞线程。

要等待每个可调用对象完成,您需要遍历列表并查看是否全部完成。当然,您可以通过在其中的每一个上调用get() 来做到这一点,但是您会一直阻塞您的主线程。我自己更喜欢在等待其他线程执行时能够做一些事情。

使用 Java 8 流的示例:

// filter if any future is not done yet
while ( list.stream().anyMatch(i->!i.isDone()) )
{
  // Do whatever you want parallel to the evaluation of the Future objects

  // example
  System.err.println( "Not all are done yet." );
}
// process your results

// example:
String[] results = list.stream().map( Main::evalGet ).toArray(String[]::new);

注意:priavte static &lt;T&gt; TevalGet(Future&lt;T&gt; fu) 只是一个包装函数,用于保持 lambda 表达式的异常处理干净,看起来类似于:

private static <T> T evalGet( Future<T> fu )
  {
    T obj = null;
    try
    {
      obj = fu.get();
    }
    catch ( InterruptedException | ExecutionException e )
    {
      e.printStackTrace();
    }
    return obj;
  }

【讨论】:

【解决方案2】:

这里的代码在执行list.get(0).get() 语句时不会等待,而是executor.invokeAll(taskList) 语句,因为invokeAll() 方法本身会等待所有线程的复杂化。

了解更多Answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2015-02-14
    • 2019-03-02
    • 2021-08-14
    • 2020-01-14
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多