在future.get()之后我需要使用threadPool.awaitTermination吗?

时间:2014-04-24 11:41:02

标签: java multithreading

我正在使用ExecutorService来创建一个线程池。添加所有任务后,threadPool将关闭。

现在Future.get()的Java Doc说

  

如果需要等待计算完成,然后检索其结果。

我无法理解“必要时”部分。 future.get()方法何时等待,等待多长时间? 如果等到线程执行结束,是否需要threadPool.awaitTermination?

ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThreads);
List<Future<?>> futureObjList = new ArrayList<Future<?>>();
for (int i = 0; i < numberOfThreads; i++) {
    ...
    Future<?> future = threadPool.submit(myThread);
    futureObjList.add(future);
    ...
}
threadPool.shutdown();

for(Future<?> future : futureObjList){
    try {
        future.get();
    } catch (Exception e1) {
        //if any thread fails, all other thread should stop their execution.
        threadPool.shutdownNow();
    }
}

try {
    threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
} catch (InterruptedException e1) {
    throw e1;
}

3 个答案:

答案 0 :(得分:1)

future.get()

将阻止调用线程,如果 Callable 的方法 .call 没有在 .get 被调用时返回结果。如果迭代每个未来,那么当你退出for循环时,所有线程都已完成执行。

答案 1 :(得分:1)

&#34;如有必要&#34;只是意味着get()方法可能会阻止或不依赖RunnableCallable中发生的事情是否已经完成。

假设您将一个Callable提交给执行者服务。 Callable需要2秒才能执行。

如果您在提交后1秒钟致电get(),则get()将再次阻止1秒。但是,如果您在提交后5秒钟调用get(),则get()不会阻止并立即返回。

答案 2 :(得分:0)

在从线程获取结果之前,您必须调用threadPool.awaitTermination(),因为awaitTermination将等待所有线程完成计算。完成所有线程后,您可以确保future.get()在完成执行时不会阻塞。除非您指定超时,否则future.get()将等待线程完成执行。