1. 程式人生 > >Java之Future(cancel,iSDone)

Java之Future(cancel,iSDone)

前言

在學習Future介面的過程中,注意到它具有一個cancel()方法,用於取消非同步的任務,它傳入一個boolean型別的引數,傳入true會中斷執行緒停止任務,而傳入false則會讓執行緒正常執行至完成,並返回false。 
由此讓我產生了疑問,false引數並不會停止任務,那麼cancel(false)有什麼用呢?

Future簡介

Future介面用於獲取非同步計算的結果,可通過get()獲取結果、cancel()取消、isDone()判斷是否完成等操作。

  • V get(): 獲取結果,若無結果會阻塞至非同步計算完成
  • V get(long timeOut, TimeUnit unit)
    :獲取結果,超時返回null
  • boolean isDone():執行結束(完成/取消/異常)返回true
  • boolean isCancelled():任務完成前被取消返回true
  • boolean cancel(boolean mayInterruptRunning):取消任務,未開始或已完成返回false,引數表示是否中斷執行中的執行緒

cancel()中的false引數

如上面所介紹的,傳入true會中斷執行緒停止任務,傳入false則會讓執行緒正常執行至完成,剛開始我難以理解傳入false的作用,既然不會中斷執行緒,那麼這個cancel方法不就沒有意義了嗎?後來查閱了許多資料,在stackoverflow

上找到了一個比較好的解釋,終於恍然大悟。

簡單來說,傳入false引數只能取消還沒有開始的任務,若任務已經開始了,就任由其執行下去。

當建立了Future例項,任務可能有以下三種狀態:

  • 等待狀態。此時呼叫cancel()方法不管傳入true還是false都會標記為取消,任務依然儲存在任務佇列中,但當輪到此任務執行時會直接跳過。
  • 完成狀態。此時cancel()不會起任何作用,因為任務已經完成了。
  • 執行中。此時傳入true會中斷正在執行的任務,傳入false則不會中斷。

總結

Future.cancel(true)適用於: 
1. 長時間處於執行的任務,並且能夠處理interruption

Future.cancel(false)適用於: 
1. 未能處理interruption的任務 
2. 不清楚任務是否支援取消 
3. 需要等待已經開始的任務執行完成