線程怎麼返回結果?一起來了解下Future


線程怎麼返回結果?一起來了解下Future

為什麼要用Future

我們在併發編程時,經常會使用兩種創建線程的方法:

  • 繼承Thread類
  • 實現Runnable接口

但是這兩種方法都缺少我們經常會遇到的一種需求----獲取線程執行結果。

比如我們要進行兩個運算,然後把兩個運算的和返回。當然我們可以使用串聯執行兩個運算,然後再將兩個結果求和返回。但是如果我們但運算特別複雜,耗時較多,我們需要統籌時間,讓兩個運算一起執行,處理器多個核心分別處理一個運算,這樣會極大降低處理時間。使用Thread和Runnable都無法獲取執行結果,這時候我們就需要用到Future了。

JDK1.5開始,就提供了Callable和Future。Future模式的核心思想能夠讓主線程將原來需要同步等待的這段時間用來做其他的事情。讓主線程不必等待任務完成,而是過段時間來獲取執行結果。

Future接口


CompetableFuture和ForkJoinFuture兩個類實現了Future接口,RunnableFuture和SchedualedFuture兩個接口繼承了Future接口

  1. RunnableFuture
    這個接口同時繼承Future接口和Runnable接口,在成功執行run()方法後,可以通過Future訪問執行結果。這個接口都實現類是FutureTask,一個可取消的異步計算,這個類提供了Future的基本實現。FutureTask能用來包裝一個Callable或Runnable對象,因為它實現了Runnable接口,而且它能被傳遞到Executor進行執行。為了提供單例類,這個類在創建自定義的工作類時提供了protected構造函數。
  2. SchedualedFuture
    這個接口表示一個延時的行為可以被取消。通常一個安排好的future是定時任務SchedualedExecutorService的結果
  3. CompleteFuture
    一個Future類是顯示的完成,而且能被用作一個完成等級,通過它的完成觸發支持的依賴函數和行為。當兩個或多個線程要執行完成或取消操作時,只有一個能夠成功。
  4. ForkJoinTask
    基於任務的抽象類,可以通過ForkJoinPool來執行。一個ForkJoinTask是類似於線程實體,但是相對於線程實體是輕量級的。大量的任務和子任務會被ForkJoinPool池中的真實線程掛起來,以某些使用限制為代價。

Future主要方法

  • get()
    當任務結束後返回一個結果,如果調用時,工作還沒有結束,則會阻塞線程,直到任務執行完畢。
  • get(long timeout,TimeUnit unit)
    可以允許在一定時間內去等待獲取執行結果,如果超過這個時間,拋出TimeoutException。
  • cancel(boolean mayInterruptIfRunning)
    我們可以取消這個執行邏輯,如果這個邏輯已經正在執行,提供可選的參數來控制是否取消已經正在執行的邏輯。調用cancel並不是一定可以停止執行。
  • isDone()
    我們可以判斷執行邏輯是否已經執行完成。
  • isCancel()
    我們可以判斷執行邏輯是否已經被取消。


分享到:


相關文章: