为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕村225694 2023-07-19 16:27:17
为什么未来.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());}它无法打印任何结果。
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

您不应该submit1.isDone()首先调用,并且绝对不应该在while循环中调用。Future.get()与阻塞调用一样,当您删除该部分时,您将从两者中获得相同的行为while()

在第二种情况下,您没有打印任何内容的原因是可调用对象还没有机会完成,因此 的条件为whilefalse。

之后你可以shutdown()调用的是ExecutorService.awaitTermination(). 它将等待给定的时间来完成所有任务。如果您不想完成任务,可以调用shutdownNow()


查看完整回答
反对 回复 2023-07-19
?
largeQ

TA贡献2039条经验 获得超7个赞

因为当你调用 .shutdown() 时,线程的状态将会改变,这使得 isDone 返回 true。查看 ThreadPoolExecutor 实现如何更改线程状态:


public void shutdown() {

    //...

    tryTerminate();

}



/**

 * Transitions to TERMINATED state if either (SHUTDOWN and pool

 * and queue empty) or (STOP and pool empty). 

 * ....

 * ....

 */

final void tryTerminate() {

....

}

isDone() 文档说该方法由于正常终止、异常或取消而返回 true。所以:


1)您提交了Callable


2)你关闭了进程,所以它的状态现在是TERMINATED


3) isDone返回true,你看到了。


在其他情况下,您的 Callable 永远不会终止、抛出异常或取消,这使得 isDone 始终返回 false。


查看完整回答
反对 回复 2023-07-19
  • 2 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信