Java多執行緒之Callable,Future,FutureTask

Sophie May發表於2019-04-02

執行緒可以通過實現Runnable介面,或者繼承Thread實現,但是這兩種方式在任務執行完成之後無法獲取返回結果,於是就有了Callable介面,Future介面與FutureTask類配和來取得返回的結果。

Callable

Java多執行緒之Callable,Future,FutureTask

Callable介面宣告瞭一個方法call(),同時這個方法返回值為V,還可以跑出異常。

Future

Future用來獲取非同步計算結果,提供以下方法宣告

 boolean cancel(boolean mayInterruptIfRunning);
 boolean isCancelled();
 boolean isDone();
 V get() throws InterruptedException, ExecutionException
 V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
複製程式碼
  • V get() :獲取非同步執行的結果,如果沒有結果可用,此方法會阻塞直到非同步計算完成。
  • boolean isDone() :任務結束返回ture;
  • V get(Long timeout , TimeUnit unit) :獲取非同步執行結果,如果沒有結果可用,此方法會阻塞,但是會有時間限制,如果阻塞時間超過設定的timeout時間,該方法將丟擲異常。
  • boolean isCancelled() :如果任務完成前被取消,則返回true。
  • boolean cancel(boolean mayInterruptRunning) :用來取消任務,如果任務還沒開始,或者任務已經完成,執行cancel(...)方法將返回false;如果任務已經啟動,執行cancel(true)方法將以中斷執行此任務執行緒的方式來試圖停止任務,如果停止成功,返回true;當任務已經啟動,執行cancel(false)方法將不會對正在執行的任務執行緒產生影響(讓執行緒正常執行到完成),此時返回false;mayInterruptRunning參數列示是否中斷執行中的執行緒。

FutureTask

public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>
複製程式碼

FutureTask類實現了RunnableFuture介面,FutureTask除了實現了Future介面外還實現了Runnable介面。FutureTask類是Future唯一實現類。

使用FutureTask時,根據FutureTask的建構函式可以看到FutureTask既可以接收Callable的實現類,也可以接收Runnable的實現類。當你傳入的是Callable的實現類時,可以獲取執行緒執行的結果;傳入Runnable的實現類時,由於Runnable的實現沒有返回值,需要傳入一個你設定的執行緒完成標識,也就是result,然後當執行緒結束時會把你傳入的result原值返回。

Java多執行緒之Callable,Future,FutureTask

Java多執行緒之Callable,Future,FutureTask

Future與FutureTask分析

我們從ExecutorService介面中submit方法入手,看下AbstractExecutorService類對submit方法的具體實現。

Java多執行緒之Callable,Future,FutureTask

使用submit方法提交任務時,都會通過newTaskFor方法轉換成FutureTask物件。

所以ExecutorService介面中submit方法歸根結底還是要把你傳入的物件封裝成FutureTask物件,並通過FutureTask類的內部實現來獲取結果的,返回的Future介面物件也要依賴於FutureTask例項化的,所以無論是直接傳入自己的Runnable、Callable實現類還是構建FutureTask傳入,本質上都是通過FutureTask去實現,沒有什麼區別。

Future與FutureTask使用

  • future
    Java多執行緒之Callable,Future,FutureTask
  • futureTask
    Java多執行緒之Callable,Future,FutureTask

相關文章