[英]Does Future.cancel(true) remove the task from the queue?
我對Future.cancel(true)
的行為有點困惑。 如果它已經在運行,它確實會interrupt
任務,但是那些尚未啟動的任務呢? 他們確實被取消了,但他們是否從隊列中刪除? 在Stackoverflow
我發現了矛盾的答案:
有人可以解釋實際行為嗎?
在表示常用ThreadPoolExecutor
作業的期貨的情況下,取消的任務不會立即從隊列中刪除,如方法purge()
所示:
purge()
嘗試從工作隊列中刪除所有已取消的
Future
任務。 此方法可用作存儲回收操作,對功能沒有其他影響。 取消的任務永遠不會執行,但可能會在工作隊列中累積,直到工作線程可以主動刪除它們。 現在調用此方法會嘗試刪除它們。 但是,這種方法可能會在存在其他線程干擾的情況下無法刪除任務。
在CompletableFuture
情況下,沒有明確說明,但由於CompletableFuture
在Executor
抽象上運行並且根本無法控制實現,我們可以假設它不會從任何隊列中刪除取消的作業。 但是,如果在取消時未滿足先決條件(即,當您使用asyncJob.thenApplyAsy(…, someExecutor)
並在asyncJob
完成之前取消它時),則該作業可能不會首先入隊。
唯一可靠的信息來源是官方文檔,即Future#cancel描述。 它說實現應該嘗試從隊列中刪除任務,但沒有義務這樣做。 由於Future
是一個接口,我們可能期望不同的實現有不同的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.