亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么未來的 .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條經驗 獲得超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。


查看完整回答
反對 回復 2023-07-19
  • 2 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號