completablefuture

CompletableFuture使用

最后都变了- 提交于 2020-03-19 17:31:12
3 月,跳不动了?>>> 一、CompletableFuture简介 https://my.oschina.net/u/2307176/blog/3196557 之前分析过FutureTask,FutureTask实现了Future接口,作为一个Task存在的,其本身是不管理线程池执行过程的,只是借助了Future的特性来来控制我们的任务,例如取消任务、设置超时时间获取任务执行结果。 CompletableFuture实现了Future和CompletionStage,表示异步计算的中不同阶段,可以对这些阶段进行组合。CompletableFuture会将任务委托给线程池处理,我们可以指定线程池Executor,也可以使用默认的ForkJoinPool,任务一般是Runnable、Supplier、Consumer、Function的实现。 二、使用ComletableFuture 我们根据功能分类,大概有三类方法:同步方法、带Async且指定Executor的异步方法,带Async使用默认ForkJoinPool的异步方法 1.创建ComletableFuture // 构造方法 public CompletableFuture() {} // 创建一个已经完成的CompletableFuture public static <U> CompletableFuture<U>

编程老司机带你玩转 CompletableFuture 异步编程

杀马特。学长 韩版系。学妹 提交于 2020-03-09 08:18:49
本文从实例出发,介绍 CompletableFuture 基本用法。不过讲的再多,不如亲自上手练习一下。所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture 。 个人博文地址:https://sourl.cn/s5MbCm 全文摘要: Future VS CompletableFuture CompletableFuture 基本用法 0x00. 前言 一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度。 Java 提供 Runnable Future<V> 两个接口用来实现异步任务逻辑。 虽然 Future<V> 可以获取任务执行结果,但是获取方式十方不变。我们不得不使用 Future#get 阻塞调用线程,或者使用轮询方式判断 Future#isDone 任务是否结束,再获取结果。 这两种处理方式都不是很优雅,JDK8 之前并发类库没有提供相关的异步回调实现方式。没办法,我们只好借助第三方类库,如 Guava ,扩展 Future ,增加支持回调功能。相关代码如下: 虽然这种方式增强了 Java 异步编程能力,但是还是无法解决多个异步任务需要相互依赖的场景。 举一个生活上的例子,假如我们需要出去旅游,需要完成三个任务: 任务一:订购航班 任务二:订购酒店 任务三:订购租车服务 很显然任务一和任务二没有相关性,可以单独执行

Java8新特性

倖福魔咒の 提交于 2020-03-06 19:02:27
1、CompletableFuture: 基本的方式创建CompletableFuture<T>对象 package future ; import java.util.Optional ; import java.util.Random ; import java.util.concurrent.CompletableFuture ; public class CompletableAction { private static Random random = new Random() ; public static void main (String[] args) { CompletableFuture<Double> completableFuture = new CompletableFuture<>() ; new Thread(() -> { Double i = get () ; completableFuture .complete(i) ; }).start() ; // 使用 get 方法,会进入阻塞,因此必须等到输出随机数,再输出 123123 /*try { Optional.ofNullable(completableFuture.get()).ifPresent(System.out::println); System.out.println(

Java8新特性 之CompletableFuture

谁都会走 提交于 2020-03-02 10:20:37
文章目录 参考 CompletableFuture引入 使用CompletableFuture作为Future实现 每一种方法都有三种形式 创建一个异步任务 计算完成时对结果的处理 whenComplete、exceptionally、handle 结果处理转换 thenApply 纯消费 thenAccept、thenRun、thenAcceptBoth、runAfterBoth 组合 thenCompose、thenCombine 任意一个方法执行完成就结束acceptEither、applyToEither 辅助方法allOf、anyOf 使用CompletableFuture提升程序性能 CompletableFuture使用详解 static方法说明 supplyAsync()使用 thenRun()使用 thenAccept()使用 参考 Java CompletableFuture 详解 CompletableFuture基本用法 使用了CompletableFuture之后,程序性能提升了三倍 Java8的CompletableFuture进阶之道–开发时看这个 CompletableFuture引入 Future是JDK5添加的类,用来描述一个异步计算的结果。可以使用 isDone 方法检查计算是否完成,或者使用 get 阻塞住调用线程,直到计算完成返回结果

多线程(二)

白昼怎懂夜的黑 提交于 2020-03-01 12:48:17
使用线程池 Java语言虽然内置了多线程支持,启动一个新线程非常方便,但是,创建线程需要操作系统资源(线程资源,栈空间等),频繁创建和销毁大量线程需要消耗大量时间。 而线程池内部维护了若干个线程,没有任务的时候,这些线程都处于等待状态。如果有新任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,新任务要么放入队列等待,要么增加一个新线程进行处理。 一、线程池实现 FixedThreadPool: 线程数固定的线程池 // 创建一个固定大小的线程池: ExecutorService es = Executors . newFixedThreadPool ( 4 ) ; CachedThreadPool: 线程数根据任务动态调整的线程池 SingleThreadExecutor: 仅单线程执行的线程池 创建指定动态范围的线程池: //最大10,最少4 int min = 4 ; int max = 10 ; ExecutorService es = new ThreadPoolExecutor ( min , max , 60 L , TimeUnit . SECONDS , new SynchronousQueue < Runnable > ( ) ) ; 创建反复指定任务的线程池: ScheduledExecutorService ses = Executors .

《Java8实战》学习笔记

时光毁灭记忆、已成空白 提交于 2020-02-26 03:37:44
第一部分 基础知识 1. 为什么要关心Java8 2. 通过行为参数化传递代码 3. Lambda 表达式 第二部分 函数式数据处理 4. 引入流 5. 使用流 6. 用流收集数据 7. 并行数据处理与性能 第三部分 高效Java 8编程 8. 重构、测试和调试 9. 默认方法 10. 用Optional取代null 11. CompletableFuture:组合式异步编程 12. 新的日期和时间API 第四部分 超越Java 8 13. 函数式的思考 14. 函数式编程的技巧 15. 面向对象和函数式编程的混合:Java 8和Scala的比较 16. 结论以及Java的未来 第一部分 基础知识 1 1.为什么要关心Java8 1.1.Java 怎么还在变 1.1.1.Java 在编程语言生态系统中的位置 1.1.2.流处理 1.1.3.用行为参数化把代码传递给方法 1.1.4.并行与共享的可变数据 1.1.5.Java 需要演变 1.2.Java 中的函数 1.2.1.方法和Lambda 作为一等公民 1.2.2.传递代码:一个例子 1.2.3.从传递方法到Lambda 1.3.流 1.3.1.多线程并非易事 1.4.默认方法 1.5.来自函数式编程的其他好思想 2 2.通过行为参数化传递代码 2.1.应对不断变化的需求 2.1.1.初试牛刀:筛选绿苹果 2.1.2.再展身手

03.ListenableFuture和Futures

时间秒杀一切 提交于 2020-02-05 13:31:21
一、作用 jdk1.8之前的Future模式一个最大的问题是:向线程池提交任务异步执行并获取的Future对象后,需要获取结果做后续处理操作的时候,还是需要阻塞某线程进行等待。这样的话,和同步调用方式就没有多大区别了。而ListenableFuture和CompletableFuture对于这种情况则是提供了很多易用的API。 如果说按照先后顺序来讲的话,首先是ListenableFuture,这是由Google Guava工具包提供的Future扩展类,随后,JDK在1.8版本中马上也提供了类似这样的类,就是CompletableFuture。 如果项目使用的jdk版本是1.8及以上,则直接使用CompletableFuture就可以了,下面分别介绍这两种工具的使用: 二、Google的ListenableFuture 先来聊聊ListenableFuture,一句话概括ListenableFuture和JDK原生Future最大的区别是前者做到了一个可以监听结果的Future。换个更通俗的讲法,就是它可以监听异步执行的过程,执行完了,自动触发什么操作。除此之外,可以分别针对成功的情况,或者失败的情况做各种后续处理 package com.mzj.guava.concurrent.future; import java.util.ArrayList; import java

CompletableFuture异步调用

a 夏天 提交于 2020-02-04 23:45:34
提要:在大型的项目某个主业务里,某个请求的调用,需要访问许多个微服务,才可以完成,但由于是远程调用,多微服务调用之间的延迟太高,用户的体验度太差,所以使用异步编排技术,由起初的一个线程执行,到多个线程异步执行,缩短请求的时间。 CompletableFuture介绍 Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用 isDone 方法检查计算是否完成,或者使用 get 阻塞住调用线程,直到计算完成返回结果,你也可以使用 cancel 方法停止任务的执行。 虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的CPU资源,而且也不能及时地得到计算结果,为什么不能用观察者设计模式当计算结果完成及时通知监听者呢? 很多语言,比如Node.js,采用回调的方式实现异步编程。Java的一些框架,比如Netty,自己扩展了Java的 Future 接口,提供了 addListener 等多个扩展方法;Google guava也提供了通用的扩展Future;Scala也提供了简单易用且功能强大的Future/Promise异步编程模式。 作为正统的Java类库,是不是应该做点什么,加强一下自身库的功能呢? 在Java 8中

Java 8 CompletableFuture 教程

断了今生、忘了曾经 提交于 2020-02-03 05:53:16
Java 8 有大量的新特性和增强如 Lambda 表达式 , Streams , CompletableFuture 等。在本篇文章中我将详细解释清楚CompletableFuture以及它所有方法的使用。 什么是CompletableFuture? 在Java中CompletableFuture用于异步编程,异步编程是编写非阻塞的代码,运行的任务在一个单独的线程,与主线程隔离,并且会通知主线程它的进度,成功或者失败。 在这种方式中,主线程不会被阻塞,不需要一直等到子线程完成。主线程可以并行的执行其他任务。 使用这种并行方式,可以极大的提高程序的性能。 Future vs CompletableFuture CompletableFuture 是 Future API 的扩展。 Future 被用于作为一个异步计算结果的引用。提供一个 isDone() 方法来检查计算任务是否完成。当任务完成时, get() 方法用来接收计算任务的结果。 从 Callbale和 Future 教程 可以学习更多关于 Future 知识. Future API 是非常好的 Java 异步编程进阶,但是它缺乏一些非常重要和有用的特性。 Future 的局限性 不能手动完成 当你写了一个函数,用于通过一个远程API获取一个电子商务产品最新价格。因为这个 API 太耗时,你把它允许在一个独立的线程中

java8 CompletableFuture_异步执行多个任务

微笑、不失礼 提交于 2020-01-21 19:49:55
前言 CompletableFuture是java8提供的基于异步操作的封装,日常开发中怎能不用上一番呢。 1)聚合多个异步任务 需求:多个tab页包含不同的表格数据,并且带分页,页面首次加载时需要显示第一页数据,并且在tab顶上显示总量,如下图所示: 各个表格数据从es中查询,涉及到计算,此处可以让前端调用多个接口来组装数据,但考虑到查询效率和网络交互,采用后端以多线程的形式查询,组合多个结果返回给前端,后端实现如下: //所有订单 CompletableFuture<OrdersBo.Item> allOrdersFuture = fillAllOrders(pd, ordersBo); //及时量订单 CompletableFuture<OrdersBo.Item> inTimeOrdersFuture = fillInTimeOrders(pd, ordersBo); //超时量订单 CompletableFuture<OrdersBo.Item> timeOutFuture = fillOverTimeOrders(pd, ordersBo); //失败量 CompletableFuture<OrdersBo.Item> failOrderFutrue = fillFailOrders(pd, ordersBo); //异常量 CompletableFuture