您好,登錄后才能下訂單哦!
這篇文章主要講解了Java FutureTask類的用法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
FutureTask一個可取消的異步計算,FutureTask 實現了Future的基本方法,提空 start cancel 操作,可以查詢計算是否已經完成,并且可以獲取計算的結果。結果只可以在計算完成之后獲取,get方法會阻塞當計算沒有完成的時候,一旦計算已經完成,那么計算就不能再次啟動或是取消。
一個FutureTask 可以用來包裝一個 Callable 或是一個runnable對象。因為FurtureTask實現了Runnable方法,所以一個 FutureTask可以提交(submit)給一個Excutor執行(excution).
FutureTask是java 5引入的一個類,從名字可以看出來FutureTask既是一個Future,又是一個Task。
我們看下FutureTask的定義:
public class FutureTask<V> implements RunnableFuture<V> { ... } public interface RunnableFuture<V> extends Runnable, Future<V> { /** * Sets this Future to the result of its computation * unless it has been cancelled. */ void run(); }
FutureTask實現了RunnableFuture接口,RunnableFuture接口是Runnable和Future的綜合體。
作為一個Future,FutureTask可以執行異步計算,可以查看異步程序是否執行完畢,并且可以開始和取消程序,并取得程序最終的執行結果。
除此之外,FutureTask還提供了一個runAndReset()的方法, 該方法可以運行task并且重置Future的狀態。
Callable和Runnable的轉換
我們知道Callable是有返回值的,而Runnable是沒有返回值的。
Executors提供了很多有用的方法,將Runnable轉換為Callable:
public static <T> Callable<T> callable(Runnable task, T result) { if (task == null) throw new NullPointerException(); return new RunnableAdapter<T>(task, result); }
FutureTask內部包含一個Callable,并且可以接受Callable和Runnable作為構造函數:
public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; // ensure visibility of callable } public FutureTask(Runnable runnable, V result) { this.callable = Executors.callable(runnable, result); this.state = NEW; // ensure visibility of callable }
它的內部就是調用了Executors.callable(runnable, result);方法進行轉換的。
以Runnable運行
既然是一個Runnable,那么FutureTask就可以以線程的方式執行,我們來看一個例子:
@Test public void convertRunnableToCallable() throws ExecutionException, InterruptedException { FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() { @Override public Integer call() throws Exception { log.info("inside callable future task ..."); return 0; } }); Thread thread= new Thread(futureTask); thread.start(); log.info(futureTask.get().toString()); }
上面例子是以單個線程來執行的,同樣我們也可以將FutureTask提交給線程池來執行:
@Test public void workWithExecutorService() throws ExecutionException, InterruptedException { FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() { @Override public Integer call() throws Exception { log.info("inside futureTask"); return 1; } }); ExecutorService executor = Executors.newCachedThreadPool(); executor.submit(futureTask); executor.shutdown(); log.info(futureTask.get().toString()); }
看完上述內容,是不是對Java FutureTask類的用法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。