Java之Future(cancel,iSDone)
阿新 • • 發佈:2019-01-03
前言
在學習Future介面的過程中,注意到它具有一個cancel()
方法,用於取消非同步的任務,它傳入一個boolean型別的引數,傳入true會中斷執行緒停止任務,而傳入false則會讓執行緒正常執行至完成,並返回false。
由此讓我產生了疑問,false引數並不會停止任務,那麼cancel(false)
有什麼用呢?
Future簡介
Future介面用於獲取非同步計算的結果,可通過get()
獲取結果、cancel()
取消、isDone()
判斷是否完成等操作。
V get()
: 獲取結果,若無結果會阻塞至非同步計算完成V get(long timeOut, TimeUnit unit)
boolean 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. 需要等待已經開始的任務執行完成