为什么未来的 .isDone() 必须在 executorService.shutdown() 之后

为什么未来.isDone()一定要在之后executorService.sutdown()。


这可以工作:


Future<Integer> submit1 = executorService.submit(callable);

executorService.shutdown();

while (submit1.isDone()){

   System.out.println(submit1.get());

}

但在我评论这一行之后:


Future<Integer> submit1 = executorService.submit(callable);

//executorService.shutdown();

while (submit1.isDone()){

   System.out.println(submit1.get());

}

它无法打印任何结果。


慕村225694
浏览 106回答 2
2回答

函数式编程

您不应该submit1.isDone()首先调用,并且绝对不应该在while循环中调用。Future.get()与阻塞调用一样,当您删除该部分时,您将从两者中获得相同的行为while()。在第二种情况下,您没有打印任何内容的原因是可调用对象还没有机会完成,因此 的条件为whilefalse。之后你可以shutdown()调用的是ExecutorService.awaitTermination().&nbsp;它将等待给定的时间来完成所有任务。如果您不想完成任务,可以调用shutdownNow()。

largeQ

因为当你调用 .shutdown() 时,线程的状态将会改变,这使得 isDone 返回 true。查看 ThreadPoolExecutor 实现如何更改线程状态:public void shutdown() {&nbsp; &nbsp; //...&nbsp; &nbsp; tryTerminate();}/**&nbsp;* Transitions to TERMINATED state if either (SHUTDOWN and pool&nbsp;* and queue empty) or (STOP and pool empty).&nbsp;&nbsp;* ....&nbsp;* ....&nbsp;*/final void tryTerminate() {....}isDone() 文档说该方法由于正常终止、异常或取消而返回 true。所以:1)您提交了Callable2)你关闭了进程,所以它的状态现在是TERMINATED3) isDone返回true,你看到了。在其他情况下,您的 Callable 永远不会终止、抛出异常或取消,这使得 isDone 始终返回 false。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java