30-非同步任務執行結果架構
- 非同步任務執行結果架構
- 應用場景
在非阻塞模型中,通常需要根據非同步的執行結果決定採取對應的操作。通過實現Callback介面,並用Future可以來接收多執行緒的執行結果。
-
- 示例:非執行緒池方式獲取Future例項
通過實現Callable介面並重寫call()方法(返回值為一個泛型物件),建立一個非同步的回撥物件call;使用call初始化一個FutureTask物件 ft,並初始化/啟動非同步任務;通過ft.get獲取非同步的執行結果。
-
- 類關係圖
-
- Future 非同步計算結果
它提供了檢查計算是否完成的方法,以等待計算的完成,並獲取計算的結果。計算完成後只能使用 get 方法來獲取結果,如有必要,計算完成前可以阻塞此方法。取消則由 cancel 方法來執行。
-
-
- 常用方法
- boolean cancel(boolean t) 嘗試取消正在執行的任務
- 常用方法
-
如果任務已完成、或已取消,或者由於某些其他原因而無法取消,則返回false。
當呼叫 cancel 時,如果呼叫成功,而此任務尚未啟動,則此任務將永不執行。
-
-
-
- boolean isCancelled() 判斷任務是否是在完成前被取消
- boolean isDone() 判斷任務是否已完成(含異常/取消而完成)
- V get() 獲取非同步執行結果
-
-
丟擲:
CancellationException - 如果計算被取消
ExecutionException - 如果計算丟擲異常
InterruptedException - 如果當前的執行緒在等待時被中斷
-
-
-
- V get(long timeout,TimeUnit unit) 等待時間內獲取非同步執行結果
-
-
TimeoutException - 如果等待超時
-
- RunnableFuture
介面同時繼承Future介面和Runnable介面;在成功執行run()方法後,可以通過Future訪問執行結果。
-
- FutureTask 可取消的非同步計算
查詢非同步計算是否完成,獲取非同步計算結果;
如果非同步計算沒有完成,get()則阻塞;當計算完成後,該非同步操作不能重啟和取消,除非呼叫runAndReset方法。
FutureTask能用來包裝一個Callable或Runnable物件,因為它實現了Runnable介面,而且它能被傳遞到Executor進行執行。
為了提供單例類,這個類在建立自定義的工作類時提供了protected建構函式。
-
-
- 構造方法
- FutureTask(Callable<V> callable)
- 構造方法
-
建立一個 FutureTask,一旦執行就執行給定的 Callable。
-
-
-
- FutureTask(Runnable runnable, V result)
-
-
建立一個 FutureTask,一旦執行就執行給定的 Runnable,並安排成功完成時 get 返回給定的結果 。
-
-
-
- 由於FutureTask實現了Runnable介面,可start()方式啟動執行緒
-
- 獲取Future物件
- 執行緒池中submit() ,execute()方式啟動的執行緒
- 通過new FutureTask(Callable/Runnable)方式獲取的Runnable例項,可start()方式啟動
-