1. 程式人生 > >Java多執行緒——FutureTask原始碼解析

Java多執行緒——FutureTask原始碼解析

一個很常見的多執行緒案例是,我們安排主執行緒作為分配任務和彙總的一方,然後將計算工作切分為多個子任務,安排多個執行緒去計算,最後所有的計算結果由主執行緒進行彙總。比如,歸併排序,字元頻率的統計等等。

我們知道Runnable是不返回計算結果的,如果想利用多執行緒的話,只能儲存到一個例項的內部變數裡面進行互動,但存在一個問題,如何判斷是否已經計算完成了。用Thread.join是一個方案,但是我們只能依次等待一個執行緒結束後處理一個執行緒,如果執行緒1恰好特別慢,則後續已經完成的執行緒不能被及時處理。我們希望能夠獲知執行緒的執行狀態,發現哪個執行緒處理完就先統計它的計算結果。可以考慮使用Callable和FutureTask來完成。

先說Callable它是一個功能介面,它只有一個方法V call(),計算一個結果,失敗的話丟擲一個異常。和Runnable不同的是,它不能直接交給Thread來執行,所以需要一個別的類來封裝它與Runnable,這個類就是FutureTask。FutureTask是一個類,繼承了RunnableFuture,而RunnableFuture是一個多繼承介面,它繼承了Runnable和 Future,所以FutureTask是可以作為實現了Runnable的例項交給Thread執行。

從內部變數來看,含有一個下層Callable例項,一個狀態表示,一個返回結果,以及對執行執行緒的記錄

原文連結