Future 接口的局限性

Future接口可以构建异步应用,但依然有其局限性。它很难直接表述多个Future 结果之间的依赖性。实际开发中,我们经常需要达成以下目的:

将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第一个的结果。

等待 Future 集合中的所有任务都完成。

仅等待 Future集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同一个值),并返回它的结果。

通过编程方式完成一个Future任务的执行(即以手工设定异步操作结果的方式)。

应对 Future 的完成事件(即当 Future 的完成事件发生时会收到通知,并能使用 Future 计算的结果进行下一步的操作,不只是简单地阻塞等待操作的结果)

新的CompletableFuture类将使得这些成为可能。

CompletableFuture

JDK1.8才新加入的一个实现类CompletableFuture,实现了Future, CompletionStage两个接口。

当一个Future可能需要显示地完成时,使用CompletionStage接口去支持完成时触发的函数和操作。

当两个及以上线程同时尝试完成、异常完成、取消一个CompletableFuture时,只有一个能成功。

CompletableFuture实现了CompletionStage接口的如下策略:

1、为了完成当前的CompletableFuture接口或者其他完成方法的回调函数的线程,提供了非异步的完成操作。

2、没有显式入参Executor的所有async方法都使用ForkJoinPool.commonPool()为了简化监视、调试和跟踪,所有生成的异步任务都是标记接口AsynchronousCompletionTask的实例。

3、所有的CompletionStage方法都是独立于其他共有方法实现的,因此一个方法的行为不会受到子类中其他方法的覆盖。

CompletableFuture实现了Futurre接口的如下策略:

1、CompletableFuture无法直接控制完成,所以cancel操作被视为是另一种异常完成形式。方法isCompletedExceptionally可以用来确定一个CompletableFuture是否以任何异常的方式完成。

2、以一个CompletionException为例,方法get()和get(long,TimeUnit)抛出一个ExecutionException,对应CompletionException。为了在大多数上下文中简化用法,这个类还定义了方法join()和getNow,而不是直接在这些情况中直接抛出CompletionException。

CompletableFuture中4个异步执行任务静态方法:

public static CompletableFuture supplyAsync(Supplier supplier) {

return asyncSupplyStage(asyncPool, supplier);

}

public static CompletableFuture supplyAsync(Supplier supplier,Executor executor) {

return asyncSupplyStage(screenExecutor(executor), supplier);

}

public static CompletableFuture runAsync(Runnable runnable) {

return asyncRunStage(asyncPool, runnable);

}

public static CompletableFuture runAsync(Runnable runnable, Executor executor) {

return asyncRunStage(screenExecutor(executor), runnable);

}

其中supplyAsync用于有返回值的任务,runAsync则用于没有返回值的任务。Executor参数可以手动指定线程池,否则默认ForkJoinPool.commonPool()系统级公共线程池,

completable java_java8 CompletableFuture异步编程相关推荐

  1. java 并发 异步_Java并发 CompletableFuture异步编程的实现

    前面我们不止一次提到,用多线程优化性能,其实不过就是将串行操作变成并行操作.如果仔细观察,你还会发现在串行转换成并行的过程中,一定会涉及到异步化,例如下面的示例代码,现在是串行的,为了提升性能,我们得 ...

  2. JUC系列(十一) | Java 8 CompletableFuture 异步编程

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  3. CompletableFuture 异步编程

    本文从实例出发,介绍 CompletableFuture 基本用法.不过讲的再多,不如亲自上手练习一下.所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture. 全文摘要: ...

  4. java8异步任务,Java8 - CompletableFuture 异步编程类

    其他异步编程方法 Java5中新增了Future接口,用来描述异步计算的结果.虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得 ...

  5. java8 CompletableFuture异步编程

    Future 接口的局限性 Future接口可以构建异步应用,但依然有其局限性.它很难直接表述多个Future 结果之间的依赖性.实际开发中,我们经常需要达成以下目的: 将两个异步计算合并为一个--这 ...

  6. 【Java并发编程实战】(十七):Future和CompletableFuture的原理及实战——异步编程没有那么难

    文章目录 引言 生活中的例子 场景1 场景2 Java中的Future 如何获取Future Future的主要方法及使用 Future的核心源码 Future模式的高阶版本-- Completabl ...

  7. Java 8 的异步编程利器 CompletableFuture 真香!

    大家好,我是不才陈某~ 最近刚好使用CompeletableFuture优化了项目中的代码,所以跟大家一起学习CompletableFuture. 一个例子回顾 Future 因为Completabl ...

  8. 【异步编程学习笔记】JDK中的FutureTask和CompletableFuture详解(使用示例、源码)

    文章目录 FutureTask概述 使用实例 类图结构 FutureTask的run()方法 FutureTask的局限性 CompletableFuture概述 CompletableFuture代 ...

  9. Java8新的异步编程方式 CompletableFuture(三)

    前面两篇文章已经整理了CompletableFuture大部分的特性,本文会整理完CompletableFuture余下的特性,以及将它跟RxJava进行比较. 3.6 Either Either 表 ...

最新文章

  1. java编程规范换行_Java编程规范整理
  2. excel 2010 group and subtotal function
  3. Consul入门04 - Consul集群 1
  4. 图像颜色迁移《color transfer between images》
  5. python 打印文件名_在Python中打印文件名,关闭状态和文件模式
  6. 从读写角度,带你了解数仓的IO基本框架
  7. djanjo 使用a标签跳转_djangoGETPOST用法以及点击a标签和form表单跳转的类型取参等...
  8. matlab 虚数 .,关于MATLAB在复数方面的应用 – MATLAB中文论坛
  9. struts2+spring+hibernate框架整合与项目
  10. ORACLE RAC 手动建库
  11. GJB-150湿热试验,国军标150试验机构
  12. 截图工具-Snipaste绿色正式版
  13. win10下载c语言软件下载,Win tc win10
  14. 国内外一些软件开发大公司
  15. DELPHI 旧控件安装到 DELPHI11 新版环境的操作
  16. 《Dynamically Fused Graph Network for Multi-hop Reasoning》 论文笔记
  17. 基站定位查询api使用接口
  18. 【开发工具】【perf】性能分析工具perf的编译和使用说明
  19. 阿里天池大数据竞赛(一)用ODPS提取特征
  20. qt中的enter键

热门文章

  1. CCF NOI1071 Pell数列
  2. 神奇的发明 —— 百叶窗
  3. Tricks(四十五)—— 可视化 min 和 max(表示一种截断)
  4. 【剑指 offer】(48)—— 不能被继承的类
  5. 布尔操作的“骤死式”(short-circuiting behavior)
  6. 行编辑器c语言,行编辑器——C语言.doc
  7. excel字符串和单元格拼接_Excel单元格内计算式及字符串拼接实现
  8. python有趣的代码-趣味至上主义:这5个有趣的Python库带你花式编码
  9. python自动化办公-用 Python 自动化办公能做到哪些有趣或有用的事情?
  10. python 在线培训费用-参加线上python培训班要多少钱?