2 回答
TA贡献1807条经验 获得超9个赞
您不应该submit1.isDone()
首先调用,并且绝对不应该在while
循环中调用。Future.get()
与阻塞调用一样,当您删除该部分时,您将从两者中获得相同的行为while()
。
在第二种情况下,您没有打印任何内容的原因是可调用对象还没有机会完成,因此 的条件为while
false。
之后你可以shutdown()
调用的是ExecutorService.awaitTermination()
. 它将等待给定的时间来完成所有任务。如果您不想完成任务,可以调用shutdownNow()
。
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。
添加回答
举报