【JUC】03-CompletableFuture使用

1. CompletableFuture

 CompletableFuture可以进行回调通知、创建异步任务、多个任务前后依赖可以组合处理、对计算速度选最快。
 CompletableFuture提供了一种类似于观察者模式的通知方式,可以在任务完成后通知监听方。
CompletableFuture实例化用CompletableFuture.runAsync()和CompletableFuture.supplyAsync()。

public class demo04 {public static void main(String[] args) {ExecutorService threadPool = Executors.newFixedThreadPool(3);// 无返回值
//        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(new MyThread4(), threadPool);
//        try {
//            System.out.println(completableFuture.get());
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        } catch (ExecutionException e) {
//            throw new RuntimeException(e);
//        }// 有返回值CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}return "Hello World";});try {System.out.println(stringCompletableFuture.get());} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}// 有返回值CompletableFuture completableFuture = CompletableFuture.supplyAsync(new MyThread5(), threadPool);try {System.out.println(completableFuture.get());} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}threadPool.shutdown();}
}
class MyThread5 implements Supplier {@Overridepublic Object get() {return "Hello Apple";}
}
class MyThread4 implements Runnable {@Overridepublic void run() {try {TimeUnit.SECONDS.sleep(3);System.out.println("Hello World");} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

2. whenCompleted与exceptionally用法

    public static void main(String[] args) {ExecutorService threadPool = Executors.newFixedThreadPool(3);try {CompletableFuture.supplyAsync(()->{int num = 10/0;try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}return num;}, threadPool).whenComplete((v,e)->{if(e == null) {System.out.println("Result is " + v);}}).exceptionally(e->{e.printStackTrace();System.out.println(e.getCause() + e.getMessage());return null;});} catch (Exception e) {throw new RuntimeException(e);} finally {threadPool.shutdown();}System.out.println("Main is completed");}

在这里插入图片描述
链式调用

public class demo06 {public static void main(String[] args){Stu stu = new Stu();stu.setId("1818").setName("Jack");System.out.println(stu.toString());CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {return "Hello World";});// 编译时,必须设置对于异常的处理try {System.out.println(completableFuture.get());} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}// 可以不进行设置对于异常的处理String join = completableFuture.join();}
}@AllArgsConstructor
@NoArgsConstructor
// 允许链式调用
@Accessors(chain = true)
@Setter
@Getter
@ToString
class Stu {private String id;private String name;
}

 CompletableFuture的例子。

public class demo07 {public static List<ShopMall> list = Arrays.asList( new ShopMall("taobao"),new ShopMall("jd"),new ShopMall("pdd"),new ShopMall("dangdang"));public static void main(String[] args){System.out.println(extracted("mysql"));}private static List<String> extracted(String productName) {List<String> stringList = list.stream()// 使用CompletableFuture实现多线程异步.map(shopMall -> CompletableFuture.supplyAsync(() -> String.format(productName + "'s price in %s is %.2f", shopMall.getShop(), shopMall.getPrice(productName)))).collect(Collectors.toList()).stream().map(completableFuture -> completableFuture.join()).collect(Collectors.toList());return stringList;}
}@AllArgsConstructor
class ShopMall {@GetterString shop;public Double getPrice(String name) {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}return ThreadLocalRandom.current().nextDouble()*2 + name.charAt(0);}
}

 CompletableFuture的用法:

public class demo08 {public static void main(String[] args) {CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}return "Hello World";});// 需要抛异常// System.out.println(completableFuture.get());// 无需抛异常// System.out.println(completableFuture.join());// 子线程没执行完, 就返回getNow的参数// System.out.println(completableFuture.getNow("Absent"));// 子线程未执行完, complete返回true, join返回complete的参数System.out.println(completableFuture.complete("Absent") + ":" + completableFuture.join());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394209.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【弱网】模拟弱网环境

fiddler工具 调整上传/下载速率 打开fiddler脚本工具&#xff0c;在上方状态栏选择 Rules -> Customize Rules…&#xff0c;打开ScriptEditor编辑器 修改上传/下载速率&#xff0c;实现模拟指定弱网环境 计算公示&#xff1a;[1/(上或下行速率/8)] x 1000 网络上行下载2G2…

【Hive】学习笔记

Hive学习笔记 【一】Hive入门【1】什么是Hive【2】Hive的优缺点&#xff08;1&#xff09;优点&#xff08;2&#xff09;缺点 【3】Hive架构原理&#xff08;1&#xff09;用户接口&#xff1a;Client&#xff08;2&#xff09;元数据&#xff1a;Metastore&#xff08;3&…

相机标定——小孔成像、相机模型与坐标系

小孔成像 用一个带有小孔的板遮挡在墙体与物之间&#xff0c;墙体上就会形成物的倒影&#xff0c;我们把这样的现象叫小孔成像。 用一个带有小孔的板遮挡在墙体与物之间&#xff0c;墙体上就会形成物的倒影&#xff0c;我们把这样的现象叫小孔成像。前后移动中间的板&#xff…

Docker 常规安装简介

Docker常规安装简介 欢迎关注我的B站&#xff1a;https://space.bilibili.com/379384819 1. 安装mysql 1.1 docker hub上面查找mysql镜像 网址&#xff1a; https://hub.docker.com/_/mysql 1.2 从docker hub上&#xff08;阿里云加速器&#xff09;拉取mysql镜像到本地标…

Redis远程字典服务器(0)——分布式系统

目录 一&#xff0c;关于Redis 二&#xff0c;分布式系统 2.1 关于分布式 2.2 理解数据库分离 2.3 理解负载均衡 2.4 数据库读写分离 2.5 引入缓存 2.6 数据库分库分表 2.7 微服务 四&#xff0c;补充 五&#xff0c;总结 一&#xff0c;关于Redis MySQL是在磁盘中存…

分类预测 | Matlab实现PSO-XGBoost粒子群算法优化XGBoost的多特征分类预测

分类预测 | Matlab实现PSO-XGBoost粒子群算法优化XGBoost的多特征分类预测 目录 分类预测 | Matlab实现PSO-XGBoost粒子群算法优化XGBoost的多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现PSO-XGBoost粒子群算法优化XGBoost的多特征分类预测&a…

英特尔:“芯”痛巨头

从全球芯片巨头到“芯”痛巨头&#xff0c; 英特尔 到底经历了什么&#xff1f; 今天券商中国说英特尔在QDII基金上这么多年&#xff0c;一直就没能进入主流持仓中&#xff0c;最后一只试探性持仓英特尔的QDII也已在今年3月末砍仓了&#xff0c; 这一砍还让这只QDII完美躲过…

医得快医疗服务交易服务平台/基于微信小程序的药品销售系统

获取源码联系方式请查看文章结尾&#x1f345; 摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而…

【中间件】Redis从入门到精通-黑马点评综合实战

文章目录 一&#xff1a;Redis基础1.Redis是什么2.初识Redis3.Redis的数据结构A.通用命令B.String类型C.Key的层级格式D.Hash类型E.List类型F.Set类型G.SortedSet类型 二&#xff1a;Redis的Java客户端1.JedisA.引入依赖B.建立连接C.测试JedisD.释放资源 2.Jedis连接池3.Spring…

如何通过GD32 MCU内部ADC参考电压通道提高采样精度?

ADC采样精度受很多因素影响&#xff0c;比如电源波动、参考电压波动、输入信号波动等&#xff0c;GD32 MCU内部提供了一个参考电压通道&#xff0c;理论上可以优化由于电源和参考电压较大波动引入的采样误差。 如下图所示&#xff0c;GD32F303 ADC内部17通道为VREFINT参考电压…

密码学基础-为什么使用真随机数(True Random Number Generators)

密码学基础-为什么使用真随机数&#xff08;True Random Number Generators&#xff09; 概述 随机的意义很重要&#xff0c;就像你的银行密码如果是亲朋好友的生日&#xff0c;结婚纪念日&#xff08;可预测的&#xff09;&#xff0c;那么就容易被人测试出来&#xff1b;而…

从零开始学习性能测试

学习目标 理解性能测试定义、目的理解常见性能测试策略理解性能指标理解性能测试方法学习性能测试工具 什么是性能测试 测试中的非功能测试其实范围比较广&#xff0c;性能、稳定性、安全性等都可以放进这个范畴。非功能测试&#xff0c;一般比功能测试门槛高些&#xff0c;多数…

深入理解计算机系统 CSAPP lab:bomb

实验资源下载地址&#xff1a;csapp.cs.cmu.edu/3e/labs.html 请先查看writeup 解压后 当我们运行bomb时,发现该程序要求我们输入行,如果输入错误,程序就会返回BOOM!!!提示我们失败了. 所以我们的目标是输入正确的行.以解开bomb程序. 实验前先详细阅读bomb.c //bomb.c /*****…

计算机系统基础(一)

开始复习了软考软件设计师还有考研复习了&#xff0c;这个重合部分比较大&#xff0c;开始学习打卡&#xff0c;基础最重要&#xff0c;直接看书又多又杂&#xff0c;重点理不出来&#xff0c;学习记录。 计算机系统基础 冯诺依曼体系结构奠定了计算机的基础结构。五个部分组成…

认识Modbus RTU与Modbus TCP

&#xff08;选自成都纵横智控-Modbus RTU与Modbus TCP协议区别详解 &#xff09; Modbus RTU 和 Modbus TCP 是两种常用的工业通信协议&#xff0c;用于连接电子设备&#xff0c;但它们在多方面有所不同。以下是它们的详细比较&#xff1a; Modbus RTU 协议类型&#xff1a; …

Flink 实时数仓(九)【DWS 层搭建(三)交易域汇总表创建】

前言 今天立秋&#xff0c;任务是完成 DWS 剩余的表&#xff0c;不知道今天能不能做完&#xff0c;欲速则不达&#xff0c;学不完就明天继续&#xff0c;尽量搞懂每一个需求&#xff1b; 1、交易域下单各窗口汇总表 任务&#xff1a;从 Kafka 订单明细主题读取数据&#xff0…

SpringBoot中使用过滤器filter

过滤器Filter 在 Java 中&#xff0c;Filter&#xff08;过滤器&#xff09;是一种用于对请求进行预处理和后处理的机制。 工作原理&#xff1a; 当一个请求到达服务器时&#xff0c;会先经过一系列配置好的过滤器。过滤器可以检查请求的参数、头信息、请求体等内容&#xf…

【ARM】v8架构programmer guide(3)_ARMv8的寄存器

目录 4.ARMv8 registers 4.1 AArch64 特殊寄存器 4.1.1 Zero register 4.1.2 Stack pointer &#xff08;SP) 4.1.3 Program Counter &#xff08;PC) 4.1.4 Exception Link Register(ELR) 4.1.5 Saved Process Status Register &#xff08;SPSR&#xff09; 4.2 Proc…

PythonStudio 控件使用常用方式(十三)TScrollBox

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 从1.2.1版开始&#xff0c;Python…

mac 2k显示器 配置

前言 今年5月份买了一个2k显示器&#xff0c;刚收到的时候发现只有一个1080 x 720&#xff08;HiDPI&#xff09;分辨率是人眼看起来比较舒服的&#xff0c;于是一直用着。但是直到开始写前端代码的时候&#xff0c;我才发现&#xff0c;网页在2k显示器和内建显示器的布局竟然…