執行緒可以通過實現Runnable介面,或者繼承Thread實現,但是這兩種方式在任務執行完成之後無法獲取返回結果,於是就有了Callable介面,Future介面與FutureTask類配和來取得返回的結果。
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() :任務結束返回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原值返回。
Future與FutureTask分析
我們從ExecutorService介面中submit方法入手,看下AbstractExecutorService類對submit方法的具體實現。
使用submit方法提交任務時,都會通過newTaskFor方法轉換成FutureTask物件。
所以ExecutorService介面中submit方法歸根結底還是要把你傳入的物件封裝成FutureTask物件,並通過FutureTask類的內部實現來獲取結果的,返回的Future介面物件也要依賴於FutureTask例項化的,所以無論是直接傳入自己的Runnable、Callable實現類還是構建FutureTask傳入,本質上都是通過FutureTask去實現,沒有什麼區別。
Future與FutureTask使用
- future
- futureTask