cancel(...)
後,isDone()
應始終true
。 cancel(...)
返回的內容無關緊要。
- 如果
cancel(...)
回報true
這意味着這個未來就是現在取消,isCancelled()==true
- 如果
cancel(...)
回報false
這意味着完成不是由於這個電話轉給cancel()
cancel(false)
意味着該cancel
方法不應該試圖取消試圖完成未來的任務(根據Future
的實現,「任務」的含義),任務將繼續運行,但未來將被取消(isDone()== true)。
cancel(true)
表示應該嘗試取消正在運行的任務,無論嘗試是否成功,未來將被取消(isDone()== true)。
請記住,這是一個合同,它必須由Future
的實施強制執行。
編輯:isDone()
始終是真實的後cancel()
這是一個測試,以實驗的一些場景:
@Test
public void test() throws ExecutionException, InterruptedException {
ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
CompletableFuture c1 = new CompletableFuture();
CompletableFuture c2 = new CompletableFuture();
Future<String> future = threadExecutor.submit(() -> {
try {
c1.complete(null);
Thread.sleep(10000);
c2.complete("normal");
} catch (InterruptedException e) {
c2.complete("interrupted");
}
return "aaa";
});
c1.join(); // waits for the task start
// future.get(); // awaits the completion
System.out.println("cancel: " + future.cancel(true));
//System.out.println("cancel: " + future.cancel(false));
System.out.println("isDone: " + future.isDone());
System.out.println("isCanceled: " + future.isCancelled());
System.out.println("task: " + c2.join());
}