徹底搞懂Future、Callable、FutureTask、Runnable

java識堂 發佈 2019-12-30T08:41:47+00:00

在這個知識泛濫、技術焦慮的時刻,人人嘴裡噴著高並發、大數據、分布式,很多估計對這個一頭霧水,無論在開發還是面試過程中,一知半解還不如不知。



引言

  • 看到標題一下子好幾個名稱,很可能你都知道、都聽過、看過,但是你真是理清楚了它們的關係了嗎?
  • 在這個知識泛濫、技術焦慮的時刻,人人嘴裡噴著高並發、大數據、分布式,很多估計對這個一頭霧水,無論在開發還是面試過程中,一知半解還不如不知。

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在背後默默的幹活。
  • 名詞雖然多了點,但是其實並沒有那麼複雜,看完本文完全可以搞清楚他們的關係。在多線程開發中能夠清晰地知道採取最好的方式。



作者:java呆
連結:https://juejin.im/post/5e08190ee51d45580359b15d

關鍵字: