亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術(shù)文章
文章詳情頁

Java FutureTask類使用案例解析

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

FutureTask一個可取消的異步計(jì)算,F(xiàn)utureTask 實(shí)現(xiàn)了Future的基本方法,提空 start cancel 操作,可以查詢計(jì)算是否已經(jīng)完成,并且可以獲取計(jì)算的結(jié)果。結(jié)果只可以在計(jì)算完成之后獲取,get方法會阻塞當(dāng)計(jì)算沒有完成的時候,一旦計(jì)算已經(jīng)完成,那么計(jì)算就不能再次啟動或是取消。

一個FutureTask 可以用來包裝一個 Callable 或是一個runnable對象。因?yàn)镕urtureTask實(shí)現(xiàn)了Runnable方法,所以一個 FutureTask可以提交(submit)給一個Excutor執(zhí)行(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實(shí)現(xiàn)了RunnableFuture接口,RunnableFuture接口是Runnable和Future的綜合體。

作為一個Future,F(xiàn)utureTask可以執(zhí)行異步計(jì)算,可以查看異步程序是否執(zhí)行完畢,并且可以開始和取消程序,并取得程序最終的執(zhí)行結(jié)果。

除此之外,F(xiàn)utureTask還提供了一個runAndReset()的方法, 該方法可以運(yùn)行task并且重置Future的狀態(tài)。

Callable和Runnable的轉(zhuǎn)換我們知道Callable是有返回值的,而Runnable是沒有返回值的。Executors提供了很多有用的方法,將Runnable轉(zhuǎn)換為Callable:

public static <T> Callable<T> callable(Runnable task, T result) { if (task == null) throw new NullPointerException(); return new RunnableAdapter<T>(task, result); }

FutureTask內(nèi)部包含一個Callable,并且可以接受Callable和Runnable作為構(gòu)造函數(shù):

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 }

它的內(nèi)部就是調(diào)用了Executors.callable(runnable, result);方法進(jìn)行轉(zhuǎn)換的。

以Runnable運(yùn)行

既然是一個Runnable,那么FutureTask就可以以線程的方式執(zhí)行,我們來看一個例子:

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

上面例子是以單個線程來執(zhí)行的,同樣我們也可以將FutureTask提交給線程池來執(zhí)行:

@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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成人毛片免费网站 | 久久青草国产手机看片福利盒子 | 京东一热本色道久久爱 | 香蕉久久夜色精品国产2020 | 亚洲高清在线观看视频 | 国产亚洲精品久久精品6 | 99热久久精品国产 | 步兵精品手机在线观看 | 亚洲国产精品热久久2022 | 久久精品国产精品青草色艺 | 成年女人免费观看 | 碰碰久久 | 欧美成人免费全部观看天天性色 | 日本视频播放免费线上观看 | 欧美aaaa在线观看视频免费 | 粉嫩jk制服美女啪啪 | 一级女性全黄久久生活片免费 | 在线欧美不卡 | 成人网18免费视频 | 男女乱配视频免费观看 | 国产玖玖在线观看 | 欧洲性大片xxxxx久久久 | 久久91精品国产91久久 | 步兵社区在线观看 | 欧美性色一级在线观看 | 手机在线亚洲 | 一区精品视频 | a毛片全部播放免费视频完整18 | 亚洲综合网在线观看首页 | 欧美人禽杂交狂配毛片 | 九九精品激情在线视频 | 91成人小视频 | 国内精品小视频福利网址 | 日本高清视频在线观看 | 99久久免费视频在线观看 | 在线观看国产一区二区三区 | 亚洲成人综合在线 | 真实一级一级一片免费视频 | 免费公开视频人人人人人人人 | 欧美成人性毛片免费版 | 欧美成人免费 |