我正試圖在我的項目中實現未來的界面。但它看起來像文檔有點模糊。java.util.concurrent.Future中的方法cancel()是否應該被阻塞?
從official documentation我們可以推斷出:
- 方法取消()不會引發像InterruptedException異常或爲ExecutionException例外。而且它沒有超時的變體。所以看起來,它不應該被阻止。
文件說
此方法返回後,後續調用isDone() 將始終返回true。
但
布爾isDone() 返回true,如果這個任務完成。
因此,如果我們在任務正在處理時運行cancel()並且無法取消,則此方法應該等到任務完成。與1
取消的返回值()描述爲
返回反駁:false,如果任務不能,通常取消,因爲它已經正常完成;真正否則
因此,如果正在運行的任務和潛在的可以取消,但不是在這個確切的時刻,我們應該返回true(我們不能說明它不能被取消)或等待(但它違背1) 。
但也有說法
後續調用isCancelled()總是返回true,如果該方法返回真。
但
布爾isCancelled() 返回true之前正常完成這個任務被取消。
其中的情況下,當我們運行取消()任務運行時,它不能說任務是否可以取消或不(因爲取消()應該在這種情況下返回true矛盾3,但isCancelled( )應該返回false)。
看起來這個API已經被很久以前刪除了,這種不一致不應該出現在文檔中。但那裏有。我理解錯誤嗎?
「因此,如果我們在任務正在處理時運行cancel()並且無法取消,則此方法應等待,直到任務完成」:* non sequitur。*實際記錄的行爲強烈依賴於'mayInterruptIfRunning '參數,你甚至沒有考慮過。 – EJP 2015-02-24 09:12:44