JDK中的Future异步编程模式

本节内容摘自《Java异步编程实战》中的一小节。

前言

本篇主要讲解如何使用JDK中的Future 实现异步编程,包括如何使用FutureTask 实现异步编程以及内部实现原理以及FutureTask 的局限性。

JDK 中的Future

在Java并发包(JUC包)中Future 代表着异步计算的结果,Future中提供了一些方法用来检查计算结果的完成,还提供了同步等待任务执行完成的方法,以及获取结果的方法。当计算结果完成时,通过提供的get系列方法来获取结果,如果使用了不带超时时间的方法来获取结果,则在计算结果完成前,调用线程会一直阻塞,另外计算任务是可以通过cancel 方法来取消的,前提就是任务未执行完毕。

首先我们来看下Future 接口的结构图

1.png
V get() throws InterruptedException, ExecutionException;

等待异步计算任务完成并返回结果;如果任务未执行完毕,则一直阻塞等待任务的完成。

CancellationException:如果计算任务被取消 抛出次异常

ExecutionException:如果任务执行中出现了异常

InterruptedException:如果等待结果线程被其他线程打断

V get(long timeout, TimeUnit unit)
   throws InterruptedException, ExecutionException, TimeoutException;

在异步计算任务未执行完成时,等待 timeout 个 unit 时间后抛出TimeoutException 异常后返回,避免了调用线程死等,可以及时释放的问题。

boolean isDone();

如果任务完成返回true,否则返回false ,注意这里的完成包括:任务正常完成、抛出异常而完成、任务被取消

boolean cancel(boolean mayInterruptIfRunning);

尝试取消任务的执行,如果任务已经完成或者已经被取消,则取消失败;如果任务还没执行则调用了该方法,则任务永远不会被执行;如果任务已经开始运行,这时候取消任务,则参数mayInterruptIfRunning决定是否要要将正在执行的任务中断;

boolean isCancelled();

如果任务在执行完毕前被取消了,则返回true,否则返回 false。

JDK中的FutureTask

FutureTask 代表了一个可被取消的异步计算任务,该类实现了RunnableFuture接口,既包含Runnable 功能,也包含Future 功能。提供了启动和取消任务,查询任务是否完成,获取计算结果等。

FutureTask 任务的执行结果只有当任务完成以后才能获取。并且只有通过get系列方法获取。当计算未完成时,get方法会阻塞等待结果,任务一旦被执行完成,除非运行的时候用了runAndReset 方法,否则任务不能被重启。FutureTask 中的任务可以是Callable 类型的,也可以是Runnable 类型的,FutureTask 类型的任务可以被提交到线程池。

2.png

FutureTask 实现了Future 接口的所有方法,并且实现了Runnable ,所以其是可执行任务,可以投递到线程池或者由线程来执行。

FutureTask 中变量state 是一个使用volatile 关键字修饰的(用来解决内存可见性防止指令重排)int变量。用来记录任务的状态。

FutureTask的局限性

FutureTask 虽然提供了用来检查任务是否完成,等待任务执行结果,获取任务执行结果的方法,但是这些特色并不足以让我们写出简洁的并发代码,比如它并不清楚的表达出多个FutureTask 之间的关系,另外为了从Future获取结果,我们必须调用get()方法,而该方法还是会在任务执行完毕前阻塞调用线程,这明显不是我们想要的。

我们真正想要的是:

1、可以将两个或多个异步计算结合在一起变成一个,这包括两个或多个异步计算是独立的时候,或者第二个异步计算依赖于第一个异步计算。

2、对反应式编程的支持,也就是当任务计算完成后进行通知,并且可以将计算结果作为下一步计算动作的参数,而不是仅仅提供调用线程以阻塞的方式获取结果。

3、可以通过编程的方式手动设置Future 的结果,FutureTask 则不可用让用户通过函数设置其计算结果,而是其任务内部进行设置。

4、可以等多个Future 对应的计算结果都出来后做一些事情。

为了克服FutureTask的局限性,以及满足我们对异步编程的需要,JDK8中提供了CompletableFuture,CompletableFuture是一个可以通过编程方式显式的设置计算结果和状态以便让任务结束的Future,本书后面章节我们会具体讲解。

总结

推荐书目:《Java异步编程实战》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容