2015-02-24 44 views
1

我正試圖在我的項目中實現未來的界面。但它看起來像文檔有點模糊。java.util.concurrent.Future中的方法cancel()是否應該被阻塞?

official documentation我們可以推斷出:

  1. 方法取消()不會引發像InterruptedException異常或爲ExecutionException例外。而且它沒有超時的變體。所以看起來,它不應該被阻止。
  2. 文件說

    此方法返回後,後續調用isDone() 將始終返回true。

    布爾isDone() 返回true,如果這個任務完成。

    因此,如果我們在任務正在處理時運行cancel()並且無法取消,則此方法應該等到任務完成。與1

  3. 取消的返回值()描述爲

    返回反駁:false,如果任務不能,通常取消,因爲它已經正常完成;真正否則

    因此,如果正在運行的任務和潛在的可以取消,但不是在這個確切的時刻,我們應該返回true(我們不能說明它不能被取消)或等待(但它違背1) 。

  4. 但也有說法

    後續調用isCancelled()總是返回true,如果該方法返回真。

    布爾isCancelled() 返回true之前正常完成這個任務被取消。

    其中的情況下,當我們運行取消()任務運行時,它不能說任務是否可以取消或不(因爲取消()應該在這種情況下返回true矛盾3,但isCancelled( )應該返回false)。

看起來這個API已經被很久以前刪除了,這種不一致不應該出現在文檔中。但那裏有。我理解錯誤嗎?

+0

「因此,如果我們在任務正在處理時運行cancel()並且無法取消,則此方法應等待,直到任務完成」:* non sequitur。*實際記錄的行爲強烈依賴於'mayInterruptIfRunning '參數,你甚至沒有考慮過。 – EJP 2015-02-24 09:12:44

回答

2

難道我明白了什麼錯誤?

我相信是的。 Future不是作業控制API;它是一個可能還沒有計算出來的價值概念的抽象概念。通過取消Future,您只需放棄對該價值的興趣;其餘的由實施細節決定。

因此,Future沒有與最終產生結果的計算強烈耦合。如果您調用cancel並返回true,則表示您已將Future移至其最終的不可更改狀態:取消的Future將永不產生其價值。潛在的計算任務可能會或可能不會持續不確定的時間;您通過Future的API通過無控制

+0

有趣的解釋。但isDone()如果在第2項中完成此任務,則返回true。文件中的其他「已完成」陳述?我們有像「任務完成」這樣的陳述,而不是像「未來關閉」這樣的陳述。這與你的解釋有點矛盾。 – 2015-06-08 08:33:41

+0

但這只是措辭; 「任務完成」意味着未來的狀態現在是最終的。文檔可能旨在更加分離任務及其結果,但API確實能夠始終保持這種分離。 – 2015-06-10 07:55:34

2

我把它讀作「isCancelled()返回true取消後()返回真」,我看不到任何出現不一致

相關問題