對於執行緒的管理,我們不僅可以通過執行緒池進行管理,我們還可以通過future和callable進行管理。
runnable介面無法返回乙個值返回。
runnable介面原始碼
@functionalinte***ce
public inte***ce runnable
runnable介面不能丟擲checked exception。
callable介面原始碼
@functionalinte***ce
public inte***ce callable
future介面的核心思想是,處理乙個方法非常耗時,系統沒有必要阻塞在這個方法上等方法的返回,這時候我們可以讓子執行緒來處理這個耗時的方法,當子執行緒在處理這個耗時的方法是,系統可以通過主線程去處理其他任務,同時可以利用future類控制方法的返回或取消方法的執行。
future介面原始碼
public inte***ce future
future.cancle(true)和future.cancle(false)所適用的情況future.cancle(true)適用於能夠處理interrupt的任務。
future.cancle(false)僅用於避免啟動尚未啟動的任務
未能處理interrupt的任務
不清楚任務是否支援取消
需要等待已經開始的任務執行完成。
callable介面與future類的關係
我們可以通過future介面的get()方法獲取callable介面的返回結果,通過get(time)方法限時獲取callable介面的返回結果,通過future.isdone()方法來判斷任務是否已經執行完了,還可以通過cancel()方法將任務取消。
在子執行緒的call()方法未執行完畢之前,主線程呼叫get()方法時會被阻塞,直到call()方法返回結果後,主線程才能夠通過future.get()方法得到結果,然後主線程由阻塞狀態切換到可執行狀態。
future介面是乙個儲存器,它儲存了任務執行call()返回的結果,而這個任務的執行時間完全取決於call()方法執行的情況而無法提前確定器執行的時間。
執行緒池的submit方法返回future物件原始碼
public inte***ce executorservice extends executor
執行緒池提交了任務之後,提交時執行緒池會立即返回給我們乙個空的future容器。當執行緒的任務一旦執行完畢,即我們可以獲取結果的時候,執行緒池便會把該結果放到之前給我們的那個空的future容器中,並不需要重新建立,所以我們便可以從該容器中獲得任務執行的結果。
future的注意點
當for迴圈批量獲取future的結果時,容易發生一部分執行緒很慢的情況,get方法呼叫時應使用timeout限制。
future的生命週期只能前進不能後退。如同執行緒池的生命週期一樣,一旦完全完成了任務,他就會永久停在"已完成"的狀態,不能重頭再來。
我們可以用futuretask來獲取future和任務的結果,它是一種包裝器,可以將callable轉化成future和runnable,因為它同時實現了future介面和runnable介面。所以它既可以作為runnable被執行緒執行,又可以作為future得到callable介面的返回值。
futuretask原始碼
public class futuretaskimplements runnablefuture
public futuretask(runnable runnable, v result)
public v get() throws interruptedexception, executionexception
public v get(long timeout, timeunit unit)
throws interruptedexception, executionexception, timeoutexception
}
futuretask建立future例項**
public class futuretaskdemo catch (interruptedexception e) catch (executionexception e)
}}class task implements callable
return sum;}}
由原始碼與例項**可知,可以將callable例項作為引數,生成futuretask的物件,然後將這個物件當作要給runnable物件,用執行緒池或其他執行緒執行這個runnable物件,最後通過futuretask獲取剛才執行的結果。 獲取子執行緒的執行結果
public class thread implements runnable private static class task implements callable public static void main string args throws executionexception,in...
Future獲取子執行緒的執行結果
runnable的缺陷 functionalinte ce public inte ce runnable callable介面類似於runnable,被其他執行緒執行的任務 實現call方法,有返回值 functionalinte ce public inte ce callable callab...
獲取執行緒的執行結果
最本質的區別在於,runnable沒有返回結果,callable會有乙個返回結果,返回結果是泛型,可以自己定義。舉例子說明 上述例子中可以看到,callable可以定義乙個返回結果,通過futuretask的get方法可以獲得執行緒執行後的結果 阻塞等待結果 原始碼檢視 allocates a ne...