2015-05-09 51 views
3

根據http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.htmlisDone返回true如果調用了cancel(boolean mayInterruptIfRunning)未來取消方法文件

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

但是,有可能是任務正在運行,並且mayInterruptIfRunning設置爲false。那麼,該電話之後應該返回isDone()?因爲取消(這是錯誤的)true

此外,還不清楚cancel(boolean)方法是否返回false

P. S.我正在實現一些簡單的線程池,所以我從Future繼承。

回答

2
  1. cancel(...)後,isDone()應始終truecancel(...)返回的內容無關緊要。
  2. 如果cancel(...)回報true這意味着這個未來就是現在取消,isCancelled()==true
  3. 如果cancel(...)回報false這意味着完成不是由於這個電話轉給cancel()
  4. cancel(false)意味着該cancel方法不應該試圖取消試圖完成未來的任務(根據Future的實現,「任務」的含義),任務將繼續運行,但未來將被取消(isDone()== true)。
  5. 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()); 
}