我正在使用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;
}
答案 0 :(得分:1)
future.get()
将阻止调用线程,如果 Callable 的方法 .call 没有在 .get 被调用时返回结果。如果迭代每个未来,那么当你退出for循环时,所有线程都已完成执行。
答案 1 :(得分:1)
&#34;如有必要&#34;只是意味着get()
方法可能会阻止或不依赖Runnable
或Callable
中发生的事情是否已经完成。
假设您将一个Callable提交给执行者服务。 Callable
需要2秒才能执行。
如果您在提交后1秒钟致电get()
,则get()
将再次阻止1秒。但是,如果您在提交后5秒钟调用get()
,则get()不会阻止并立即返回。
答案 2 :(得分:0)
在从线程获取结果之前,您必须调用threadPool.awaitTermination()
,因为awaitTermination将等待所有线程完成计算。完成所有线程后,您可以确保future.get()
在完成执行时不会阻塞。除非您指定超时,否则future.get()
将等待线程完成执行。