Future 接口的局限性

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

将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第一个的结果。
等待 Future 集合中的所有任务都完成。
仅等待 Future集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同一个值),并返回它的结果。
通过编程方式完成一个Future任务的执行(即以手工设定异步操作结果的方式)。
应对 Future 的完成事件(即当 Future 的完成事件发生时会收到通知,并能使用 Future 计算的结果进行下一步的操作,不只是简单地阻塞等待操作的结果)

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

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

当一个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 <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) { 

  return asyncSupplyStage(asyncPool, supplier); } 

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

  return asyncSupplyStage(screenExecutor(executor), supplier); } 

public static CompletableFuture<Void> runAsync(Runnable runnable) { 

  return asyncRunStage(asyncPool, runnable); } 

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

  return asyncRunStage(screenExecutor(executor), runnable); }

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

转载于:https://www.cnblogs.com/leizhuang/p/9968370.html

java8 CompletableFuture异步编程相关推荐

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

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

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

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

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

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

  4. CompletableFuture 异步编程

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

  5. completable java_java8 CompletableFuture异步编程

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

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

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

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

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

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

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

  9. 《Java8实战》读书笔记10:组合式异步编程 CompletableFuture

    <Java8实战>读书笔记10:组合式异步编程 CompletableFuture 第11章 CompletableFuture:组合式异步编程 11.1 Future 接口 (只是个引子 ...

最新文章

  1. JavaScript的几个概念简单理解(深入解释见You Don't know JavaScript这本书)
  2. 在.NET Core 中实现健康检查
  3. CF 1475 F . Unusual Matrix 思维
  4. Centos7 Docker 安装与启动_入门试炼01
  5. python制作测试报告_使用 python 生成 extent report 测试报告
  6. 简单的JSP分页显示
  7. Hibernate的学习详解(4)
  8. 什么是GRE词汇红宝书?
  9. python 发送邮件正文字体设置_python 发送邮件
  10. 正方形长方形的个数 规律
  11. spss常态检验_利用SPSS检验数据是否符合正态分布
  12. MYSQL解决科目余额表汇总问题
  13. excel常用函数及功能操作
  14. python 泰森多边形边界_泰森多边形
  15. Latex-插入eps图片失败解决方法“ Latex Package pdftex.def Error....”
  16. 期货开户客户出入金是什么时间?
  17. 微信小程序:喝酒娱乐小游戏助力神器
  18. gromcas 分析NAMD轨迹文件dcd
  19. MATLAB中出现NAN
  20. ubuntu16.04 vncserver gnome 不能正常显示系统界面和鼠标图标。

热门文章

  1. CRITICAL_SECTION的详细说明
  2. Xcode的Architectures、Valid Architectures和Build Active Architecture Only属性
  3. shell中#*,##*,#*,##*,% *,%% *的含义及用法
  4. 简明深度学习方法概述 Deep Learning:Methods and Application
  5. 基于OpenCL的深度学习工具:AMD MLP及其使用详解
  6. [Office]Word2010(windows版)粘贴不合并格式
  7. 以太坊---「地址、密码、私钥、助记词、Keystore 」那些事
  8. 【移动开发】Android中三种超实用的滑屏方式汇总(ViewPager、ViewFlipper、ViewFlow)...
  9. ubuntu16禁用utc时间
  10. 细说SSO单点登录(转)