2 回答

TA貢獻1807條經驗 獲得超9個贊
您不應該submit1.isDone()
首先調用,并且絕對不應該在while
循環中調用。Future.get()
與阻塞調用一樣,當您刪除該部分時,您將從兩者中獲得相同的行為while()
。
在第二種情況下,您沒有打印任何內容的原因是可調用對象還沒有機會完成,因此 的條件為while
false。
之后你可以shutdown()
調用的是ExecutorService.awaitTermination()
. 它將等待給定的時間來完成所有任務。如果您不想完成任務,可以調用shutdownNow()
。

TA貢獻2039條經驗 獲得超8個贊
因為當你調用 .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。
添加回答
舉報