Java 多線程Callable接口和Future接口 介紹(一)

step1:  Callable和Future出現的原因

創建線程的2種方式

  • 一種是直接繼承Thread
  • 一種就是實現Runnable接口

這2種方式都有一個缺陷就是:

在執行完任務之後無法獲取線程執行結果。 如果需要獲取執行結果,就必須通過共享變量或者使用線程通信的方式來達到效果,這樣使用起來就比較麻煩。

Callable和Future出現的原因就是解決上面缺陷。

step2:  Callable接口介紹

callable 類圖

Callable位於java.util.concurrent包下,它也是一個接口,在它裏面也只聲明瞭一個方法,只不過這個方法叫做call()。

以看到,這是一個泛型接口,call()函數返回的類型就是傳遞進來的V類型。

   那麼怎麼使用Callable呢?

step3:  Future接口介紹

在Future接口中聲明瞭5個方法,下面依次解釋每個方法的作用:

cancel方法用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。參數mayInterruptIfRunning表示是否允許取消正在執行卻沒有執行完畢的任務,如果設置true,則表示可以取消正在執行過程中的任務。如果任務已經完成,則無論mayInterruptIfRunning爲true還是false,此方法肯定返回false,即如果取消已經完成的任務會返回false;如果任務正在執行,若mayInterruptIfRunning設置爲true,則返回true,若mayInterruptIfRunning設置爲false,則返回false;如果任務還沒有執行,則無論mayInterruptIfRunning爲true還是false,肯定返回true。

isCancelled方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。

isDone方法表示任務是否已經完成,若任務完成,則返回true;

get()方法用來獲取執行結果,這個方法會產生阻塞,會一直等到任務執行完畢才返回;

get(long timeout, TimeUnit unit)方法用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。

也就是說Future提供了三種功能:

  1. 判斷任務是否完成;
  2. 能夠中斷任務;
  3. 能夠獲取線程任務執行結果。

因爲Future只是一個接口,所以是無法直接用來創建對象使用的,因此就有了下面的FutureTask。

 

step4:  FutureTask介紹

如上提供了兩個構造函數,一個以Callable爲參數,另外一個以Runnable爲參數。這些類之間的關聯對於任務建模的辦法非常靈活,允許你基於FutureTask的Runnable特性(因爲它實現了Runnable接口),把任務寫成Callable,然後封裝進一個由執行者調度並在必要時可以取消的FutureTask。

FutureTask可以由執行者調度,這一點很關鍵。它對外提供的方法基本上就是Future和Runnable接口的組合:get()、cancel、isDone()、isCancelled()和run(),而run()方法通常都是由執行者調用,我們基本上不需要直接調用它,而是又線程池中submit方法自己調度,並且返回當前線程任務執行結果。

線程池的submit方法,根據查看源碼,實現了futuretask,由execute方法調度,執行線程start方法

execute中啓動線程任務

step5 :  代碼實例演示 

因文章太長,不便閱讀,代碼實例部分,分下一章演示。

連接 : https://blog.csdn.net/nameIsHG/article/details/106752609

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章