前言
在學習Future接口的過程中,注意到它具有一個cancel()
方法,用於取消異步的任務,它傳入一個boolean類型的參數,傳入true會中斷線程停止任務,而傳入false則會讓線程正常執行至完成,並返回false。
由此讓我產生了疑問,false參數並不會停止任務,那麼cancel(false)
有什麼用呢?
Future簡介
Future接口用於獲取異步計算的結果,可通過get()
獲取結果、cancel()
取消、isDone()
判斷是否完成等操作。
V get()
: 獲取結果,若無結果會阻塞至異步計算完成V get(long timeOut, TimeUnit unit)
:獲取結果,超時返回nullboolean isDone()
:執行結束(完成/取消/異常)返回trueboolean isCancelled()
:任務完成前被取消返回trueboolean 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. 需要等待已經開始的任務執行完成