国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java FutureTask類使用案例解析

瀏覽:93日期:2022-09-02 13:07:19

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()); }

本文的例子可參考https://github.com/ddean2009/learn-java-concurrency/tree/master/futureTask

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 手机看片日韩国产一区二区 | 亚洲欧美视频在线观看 | 久久久久久久久久免费视频 | 国产精品情人露脸在线观看 | 337p粉嫩大胆噜噜噜鲁 | 曰本人做爰大片免费观看一 | 国产一级做a爰片... | 99re9精品视频在线 | 高清精品一区二区三区一区 | 免费一级毛片女人图片 | 亚洲国产第一区二区香蕉日日 | 国产成人在线视频播放 | 毛片免费观看久久欧美 | 欧美人成人亚洲专区中文字幕 | 97超级碰碰碰免费公开在线观看 | 免看一级a毛片一片成人不卡 | 午夜爽爽| 狠狠色丁香婷婷久久综合考虑 | 欧美成人3d动漫专区 | 国产偷国产偷亚洲高清在线 | 国产男女乱淫真视频全程播放 | 依依成人综合网 | 男人天堂新地址 | 欧美一级毛片黄 | 日韩专区亚洲国产精品 | 国产亚洲片 | 999久久久精品视频在线观看 | 欧美特黄特色aaa大片免费看 | 特黄aa级毛片免费视频播放 | 在线视频99 | 99免费视频观看 | 欧美亚洲影院 | 欧美成人精品欧美一级乱黄 | 国产精品久久久久亚洲 | 欧美成年视频 | 亚洲一区在线观看视频 | 女人让男人桶的小视频 | 男人扒开腿躁女人j | 91日本在线观看亚洲精品 | 精品少妇一区二区三区视频 | 久久久久久久国产精品 |