2 回答

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

TA貢獻2039條經(jīng)驗 獲得超8個贊
因為當你調(diào)用 .shutdown() 時,線程的狀態(tài)將會改變,這使得 isDone 返回 true。查看 ThreadPoolExecutor 實現(xiàn)如何更改線程狀態(tài):
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)你關(guān)閉了進程,所以它的狀態(tài)現(xiàn)在是TERMINATED
3) isDone返回true,你看到了。
在其他情況下,您的 Callable 永遠不會終止、拋出異?;蛉∠@使得 isDone 始終返回 false。
添加回答
舉報