Java多線程之Callable,Future,FutureTask

線程能夠經過實現Runnable接口,或者繼承Thread實現,可是這兩種方式在任務執行完成以後沒法獲取返回結果,因而就有了Callable接口,Future接口與FutureTask類配和來取得返回的結果。bash

Callable

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() :任務結束返回true;
  • 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惟一實現類。spa

使用FutureTask時,根據FutureTask的構造函數能夠看到FutureTask既能夠接收Callable的實現類,也能夠接收Runnable的實現類。當你傳入的是Callable的實現類時,能夠獲取線程執行的結果;傳入Runnable的實現類時,因爲Runnable的實現沒有返回值,須要傳入一個你設置的線程完成標識,也就是result,而後當線程結束時會把你傳入的result原值返回。線程

Future與FutureTask分析

咱們從ExecutorService接口中submit方法入手,看下AbstractExecutorService類對submit方法的具體實現。3d

使用submit方法提交任務時,都會經過newTaskFor方法轉換成FutureTask對象。code

因此ExecutorService接口中submit方法歸根結底仍是要把你傳入的對象封裝成FutureTask對象,並經過FutureTask類的內部實現來獲取結果的,返回的Future接口對象也要依賴於FutureTask實例化的,因此不管是直接傳入本身的Runnable、Callable實現類仍是構建FutureTask傳入,本質上都是經過FutureTask去實現,沒有什麼區別。cdn

Future與FutureTask使用

  • future
  • futureTask
相關文章
相關標籤/搜索