1. 程式人生 > >30-非同步任務執行結果架構

30-非同步任務執行結果架構

  1. 非同步任務執行結果架構
    1. 應用場景

在非阻塞模型中,通常需要根據非同步的執行結果決定採取對應的操作。通過實現Callback介面,並用Future可以來接收多執行緒的執行結果。

    1. 示例:非執行緒池方式獲取Future例項

通過實現Callable介面並重寫call()方法(返回值為一個泛型物件),建立一個非同步的回撥物件call;使用call初始化一個FutureTask物件 ft,並初始化/啟動非同步任務;通過ft.get獲取非同步的執行結果。

 

    1. 類關係圖

    1. Future  非同步計算結果

它提供了檢查計算是否完成的方法,以等待計算的完成,並獲取計算的結果。計算完成後只能使用 get 方法來獲取結果,如有必要,計算完成前可以阻塞此方法。取消則由 cancel 方法來執行。

      1. 常用方法
        1. boolean cancel(boolean t) 嘗試取消正在執行的任務

如果任務已完成、或已取消,或者由於某些其他原因而無法取消,則返回false。

當呼叫 cancel 時,如果呼叫成功,而此任務尚未啟動,則此任務將永不執行。

        1. boolean isCancelled() 判斷任務是否是在完成前被取消
        2. boolean isDone() 判斷任務是否已完成(含異常/取消而完成)
        3. V get() 獲取非同步執行結果

   丟擲:

        CancellationException - 如果計算被取消

        ExecutionException - 如果計算丟擲異常

        InterruptedException - 如果當前的執行緒在等待時被中斷

        1. V get(long timeout,TimeUnit unit) 等待時間內獲取非同步執行結果

        TimeoutException - 如果等待超時

    1. RunnableFuture

介面同時繼承Future介面和Runnable介面;在成功執行run()方法後,可以通過Future訪問執行結果。

    1. FutureTask 可取消的非同步計算

查詢非同步計算是否完成,獲取非同步計算結果;

如果非同步計算沒有完成,get()則阻塞;當計算完成後,該非同步操作不能重啟和取消,除非呼叫runAndReset方法。

 FutureTask能用來包裝一個Callable或Runnable物件,因為它實現了Runnable介面,而且它能被傳遞到Executor進行執行。

為了提供單例類,這個類在建立自定義的工作類時提供了protected建構函式。

      1. 構造方法
        1. FutureTask(Callable<V> callable)

建立一個 FutureTask,一旦執行就執行給定的 Callable。

        1. FutureTask(Runnable runnable, V result)

 建立一個 FutureTask,一旦執行就執行給定的 Runnable,並安排成功完成時 get 返回給定的結果 。

        1. 由於FutureTask實現了Runnable介面,可start()方式啟動執行緒
    1. 獲取Future物件
      1. 執行緒池中submit() ,execute()方式啟動的執行緒
      2. 通過new FutureTask(Callable/Runnable)方式獲取的Runnable例項,可start()方式啟動