(十三) 說一下runnable 和 callable 有什麼區別?Future是什麼?

Java魚仔發表於2020-10-26

微信搜尋《Java魚仔》,每天一個知識點不錯過

所有內容以及歷史知識點均會更新到github上,歡迎star

(一)每天一個知識點

說一下runnable 和 callable 有什麼區別?FutureTask是什麼?

(二)回答

2.1 runnable和callable的區別

runnable和callable都可以用來編寫多執行緒程式,兩者的區別在於:

1.實現了runnable介面後無法返回結果資訊,實現了callable介面後有返回值。

2.實現了runnable介面異常無法通過throws丟擲異常,實現了callable介面後可以直接丟擲Exception異常

2.2 Future是什麼?

在使用callable介面實現多執行緒時,我們會用到FutureTask去獲取返回值,那麼Future和FutureTask是什麼?

Future是一個獲取非同步計算結果的介面,而FutureTask是Future的一個實現類。

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

future介面的原始碼很簡單,它實現了五個方法

boolean cancel(boolean mayInterruptRunning) :如果任務還沒開始,執行cancel(…)方法將返回false;如果任務已經啟動,執行cancel(true)方法將以中斷執行此任務執行緒的方式來試圖停止任務,如果停止成功,返回true;當任務已經啟動,執行cancel(false)方法將不會對正在執行的任務執行緒產生影響(讓執行緒正常執行到完成),此時返回false;當任務已經完成,執行cancel(…)方法將返回false。mayInterruptRunning參數列示是否中斷執行中的執行緒。

boolean isCanceller() :如果任務完成前被取消,則返回true。

boolean isDone() :如果任務執行結束,無論是正常結束或是中途取消還是發生異常,都返回true。

V get() :獲取非同步執行的結果,如果沒有結果可用,此方法會阻塞直到非同步計算完成。

V get(Long timeout , TimeUnit unit) :獲取非同步執行結果,如果沒有結果可用,此方法會阻塞,但是會有時間限制,如果阻塞時間超過設定的timeout時間,該方法將丟擲異常。

總結起來Future實現以下幾個功能:可以中斷正在執行的任務、可以判斷任務是否還在執行、可以獲取到任務執行後的結果。FutureTask是Future介面一個比較常用的實現類

相關文章