簡體   English   中英

Future.cancel(true) 是否從隊列中刪除任務?

[英]Does Future.cancel(true) remove the task from the queue?

我對Future.cancel(true)的行為有點困惑。 如果它已經在運行,它確實會interrupt任務,但是那些尚未啟動的任務呢? 他們確實被取消了,但他們是否從隊列中刪除? Stackoverflow我發現了矛盾的答案:

不從隊列中移除任務

是否從隊列中刪除任務

有人可以解釋實際行為嗎?

在表示常用ThreadPoolExecutor作業的期貨的情況下,取消的任務不會立即從隊列中刪除,如方法purge()所示:

purge()

嘗試從工作隊列中刪除所有已取消的Future任務。 此方法可用作存儲回收操作,對功能沒有其他影響。 取消的任務永遠不會執行,但可能會在工作隊列中累積,直到工作線程可以主動刪除它們。 現在調用此方法會嘗試刪除它們。 但是,這種方法可能會在存在其他線程干擾的情況下無法刪除任務。

CompletableFuture情況下,沒有明確說明,但由於CompletableFutureExecutor抽象上運行並且根本無法控制實現,我們可以假設它不會從任何隊列中刪除取消的作業。 但是,如果在取消時未滿足先決條件(即,當您使用asyncJob.thenApplyAsy(…, someExecutor)並在asyncJob完成之前取消它時),則該作業可能不會首先入隊。

唯一可靠的信息來源是官方文檔,即Future#cancel描述。 它說實現應該嘗試從隊列中刪除任務,但沒有義務這樣做。 由於Future是一個接口,我們可能期望不同的實現有不同的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM