十九、异步任务编排CompletableFuture
一、简介
并发编程中我们经常创建异步线程来执行任务。但是,当异步任务之间存在依赖关系时,使得我们开发过程变得更加复杂。比如:
1、线程2依赖于线程1的执行结果
2、线程3依赖于线程1和线程2执行结果的合并
要实现以上两个异步线程的依赖,我们可能会采用等待/通知、消费队列或者一些比较麻烦的逻辑来控制异步任务的的关系。这期间,你可能不得不考虑中间结果,以及并发临界点等问题。
总而言之,对于复杂的异步任务的控制不是一个容易的事情。
CompletableFuture
completableFuture是JDK于1.8+提供的一个实现类,它主要用于异步任务的编排,很好地帮我们解决异步任务控制逻辑。
它实现了Future接口和CompletableStage接口,所以你可以像使用Future一样简单地使用CompletableFuture。
JDK文档:https://blog.fondme.cn/apidoc/jdk-1.8-google/java/util/concurrent/CompletableFuture.html
二、使用示例
线程2依赖于线程1的执行结果
// 线程1执行结果
CompletableFuture.supplyAsync(() -> "hello ")
// 消费线程1执行结果
.thenAccept(x -> System.out.println(x + "world"));
输出结果:
hello world
线程3依赖于线程1和线程2执行结果的合并
// 线程1执行结果
CompletableFuture.supplyAsync(() -> "hello ")
// 结合线程2执行结果
.thenCombineAsync(CompletableFuture.supplyAsync(() -> "world"), (x, y) -> x + y)
// 消费线程1和2的合并结果
.thenAccept(x -> System.out.println(x));
输出结果:
hello world
异步任务的编排,实际上是对同步和异步的交点进行了控制,Completable把这个控制逻辑从业务任务代码中抽离了出来。这样你可以更加专注于编写异步任务中的代码。
十九、异步任务编排CompletableFuture的更多相关文章
- 使用CompletableFuture进行异步任务编排
1.JDK5引入了Future进行异步任务的处理,Future 的接口主要方法有以下几个: (1)boolean cancel (boolean mayInterruptIfRunning) 取消任务 ...
- Python之路【第十九篇】:爬虫
Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...
- spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?
spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的? 消息中间件在解决异步处理,模块间解耦和,和高流量场景的削峰,等情况下有着很广泛的应用 . 本文将跟大家一起 ...
- WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形
原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...
- Flask 教程 第十九章:Docker容器上的部署
本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...
- vue第十九单元(mapState mapMutations等方法的使用)
第十九单元(mapState mapMutations等方法的使用) #课程目标 1.熟练使用mapState 2.熟练使用mapGetters 3.熟练使用mapActions 4.熟练使用mapM ...
- 无废话ExtJs 入门教程十九[API的使用]
无废话ExtJs 入门教程十九[API的使用] extjs技术交流,欢迎加群(201926085) 首先解释什么是 API 来自百度百科的官方解释:API(Application Programmin ...
- Python之路【第十九章】:Django进阶
Django路由规则 1.基于正则的URL 在templates目录下创建index.html.detail.html文件 <!DOCTYPE html> <html lang=&q ...
- Bootstrap <基础二十九>面板(Panels)
Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...
随机推荐
- WebService-php- 1(16)
最近看了挺多关于php中webservice的资料,感谢燕十八的分享,帮助了我构建服务端的过程.将学习笔记记录如下,其中包含燕十八的笔记. WebService 1 快速了解WebService 通俗 ...
- Java中 IO类 - File类中的判断功能
package com.hxzy.IOSer;import java.io.*;public class Demo05 { public static void main(String[] args) ...
- CAS客户端整合(二) Zabbix
Zabbix是一个强大的服务器/交换机监控应用,有zabbix-server, zabbix-client, zabbix-web 三部分.zabbix-web管理端是用php写的. 前文参考:CAS ...
- Python 用队列实现多线程并发
# Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,但是不够规范 # encoding: utf-8 __author__ = 'yeayee.com' # 由本站 ...
- Elasticsearch基础知识
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口Elasticsearch是用Java开发的,并作为Apache ...
- JS 返回上一页并刷新,但不用重新加载整个页面(ajax实现)
需求 有三个页面A.B.C,点击A=>B,点击B=>C,在C中添加内容,点击确定返回到B,此时B页面需重新加载新的内容.再次点击B的返回按钮,希望返回到A而不是C. ===== 2017/ ...
- 关闭tomcat端口号
一. CentOS 关闭tomcat端口号 1. 首先保证liunx下 ps -ef | grep java 2. 会显示如下信息 我使用的是IDEA打包的war包.tomcat是自带的 3. 查看未 ...
- Android-获取手机已经安装的程序
有时候我们会查询手机里面是否安装了某个程序,或者获取已经安装软件名称的集合. android这边提供了相应的接口. [java] view plaincopy final PackageManager ...
- Spring Boot 入门系列
本系列博文版权 简书 面皮大师 所有,转载请标明原文及出处: http://www.jianshu.com/u/062bd8f1299c 项目地址: https://github.com/daleiw ...
- angular4套用primeng样式
首先安装primeng cnpm install primeng --save 这样会在项目目录中增加node_modules\primeng目录 package.json文件增加了以下一行 &quo ...