完全搞懂Future、Callable、FutureTask、Runnable

引言

  • 看到標題一會兒好幾個名稱,極可能你都知道、都聽過、看過,可是你真是理清楚了它們的關係了嗎?
  • 在這個知識氾濫、技術焦慮的時刻,人人嘴裏噴着高併發、大數據、分佈式,不少估計對這個一頭霧水,不管在開發仍是面試過程當中,只知其一;不知其二還不如不知。

Runnable/Thread

  • 一般狀況下的耗時操做會交給多線程來處理,Java中開啓一個新線程很容易,繼承自Thread或實現Runnable接口。下面是常規操做。

  • 開啓多線程不少時候是爲了利用CPU的多核能力。new Thread()或實現Runnable很容易實現,那爲什麼還須要Future、Callable呢?是JDK開發者嫌頭髮多了嗎?
  • 一般狀況下咱們只管一頓操做,開啓線程扔出去,至於返回值咱們開發中好像歷來沒管過。其實不管是new Thread()仍是實現Runnable在執行完了都是沒法獲取執行結果的,不是咱們不想管而是管不了。至於線程執行成功仍是失敗,不少時候都是聽天由命,由於大多狀況下咱們默認這個執行操做確定會成功。出了問題也只能追日誌了。
  • 經過共享變量或者線程通訊的方式卻是能夠間接獲取執行結果,可是相信我以你的水平,怕是要996解bug。

Future機制

Callable

  • 那既然到這裏了,相信你也能猜到Java 1.5中引入的Callable就是解決這個返回值的問題,

  • Callable是一個接口,一個函數式接口,也是個泛型接口。call()有返回值,且返回值類型與泛型參數類型相同,且能夠拋出異常。Callable能夠看做是Runnable接口的補充。

Future

  • 也許Future的知名度更高,一般所說的Future機制而不是Callable機制。既然Callable能夠解決無返回值的問題,那麼Future又是什麼呢?
  • Future是爲了配合Callable/Runnable而產生的,既然有返回值,那麼返回什麼?何時返回?這些問題其實均可以算在Future機制裏。
  • 簡單來說我認爲Future是一個句柄,即Callable任務返回給調用方這麼一個句柄,經過這個句柄咱們能夠跟這個異步任務聯繫起來,咱們能夠經過future來對任務查詢、取消、執行結果的獲取,是調用方與異步執行方之間溝通的橋樑。

FutureTask

  • 到如今基本清晰了,Future機制就是爲了解決多線程返回值的問題。可是Callable、Future、RunnableFuture都是接口,接口不幹活啊。不要緊,FutureTask來了。

  • FutureTask實現了RunnableFuture接口,同時具備Runnable、Future的能力,即既能夠做爲Future獲得Callable的返回值,又能夠做爲一個Runnable。面試

  • FutureTask是一個泛型類,下面是一個demo。多線程

小結

  • Future機制並非對Runnable的革名,只是對Runnable的擴展。Callable、Future、FutureTask的配合,解決Runnable無返回值的問題。
  • Callable、Future、RunnableFuture都是接口,是FutureTask在背後默默的幹活。
  • 名詞雖然多了點,可是其實並無那麼複雜,看完本文徹底能夠搞清楚他們的關係。在多線程開發中可以清晰地知道採起最好的方式。
相關文章
相關標籤/搜索