JAVA中CompletableFuture类的使用

Future

1.检查已分配的任务是否已处理

boolean isDone = future.isDone();

isDone()方法用来判断Future任务是否执行完毕,通常结合get方法使用。

while(!future.isDone()) {System.out.println("Calculating...");Thread.sleep(300);
}
Integer result = future.get();

2.取消任务执行

boolean canceled = future.cancel(true);
completableFuture.cancel(false);

参数false为如果任务已经在执行,则不做取消

3.检查任务是否已取消

boolean isCancelled = future.isCancelled();

CompletableFuture

CompletableFuture继承自Future,他是Future的包装类

创建CompletableFuture

CompletableFuture<String> completableFuture = new CompletableFuture<>();

任务方法使用

1.complete方法:用于手动完成一个 CompletableFuture,并将其结果设置为指定的值,有返回值(感觉多此一举)。
在执行者的excute、submit、invoke方法中设置任务内容,任务内容只能在线程的执行方法中设置。

Future<String> submit = executorService.submit(() -> {Thread.sleep(500);completableFuture.complete("Hello");return null;
});

2.supplyAsync方法:非阻塞方法,用于执行耗时任务,有返回值

CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "hello");

3.runAsync方法:非阻塞方法,用于执行耗时任务,无返回值

CompletableFuture.runAsync(() -> {System.out.println("hello");});

4.thenApply方法:阻塞方法,接收上一个任务返回的结果,做出一些处理,有返回值

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<String> resultFuture = future.thenApply(value -> "Result: " + value);

5.thenApplyAsync方法:非阻塞方法,接收上一个任务返回的结果,做出一些处理,有返回值

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<Integer> result = future.thenApplyAsync(x -> x * 5);

6.thenCombine方法:接收一个新任务,组合处理这两个任务的结果,有返回值

CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Hello");CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);

7.thenAccept方法:接收上一个任务返回的结果,做出一些处理,无返回值

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<Void> resultFuture = future.thenAccept(value -> System.out.println("Result: " + value));

8.thenRun方法:不接收上一个任务返回的结果,做出一些处理,无返回值

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<Void> resultFuture = future.thenRun(() -> System.out.println("任务执行完成"));

9.thenAcceptBoth方法:接收一个新任务,组合处理这两个任务的结果,无返回值

CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Hello");future1.thenAcceptBoth(future2, (result1, result2) -> {System.out.println(result1 + " " + result2);
});

10.allOf方法:接收n个新任务,返回一个新的任务,通常与get或join一起使用来等待所有子任务完成,但是此方法并不能获取每个子任务的结果,不推荐使用,推荐使用下一个提到的stream流方式

CompletableFuture<String> future1  
= CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2  
= CompletableFuture.supplyAsync(() -> "Beautiful");
CompletableFuture<String> future3  
= CompletableFuture.supplyAsync(() -> "World");CompletableFuture<Void> combinedFuture 
= CompletableFuture.allOf(future1, future2, future3);combinedFuture.get();

11.Stream流方法:等待所有任务完成,并处理所有任务的结果,因为调用了join方法,所以会等待。

String combined = Stream.of(future1, future2, future3)
.map(CompletableFuture::join)
.collect(Collectors.joining(" "));

异常处理

方法一:在步骤方法之后加入handle方法来处理异常

String name = null;
CompletableFuture<String> completableFuture  
=  CompletableFuture.supplyAsync(() -> {if (name == null) {throw new RuntimeException("Computation error!");}return "Hello, " + name;
}).handle((s, t) -> s != null ? s : "Hello, Stranger!");

方法二:异常完成方法completeExceptionally,如果complete方法出现异常则调用catch的completeExceptionally方法

try {int result = 15;completableFuture.complete(result); // Complete successfully
} catch (Exception ex) {completableFuture.completeExceptionally(ex); // Complete exceptionally
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Python图解】 常量与变量及基本运算

【图解python】 常量与变量及基本运算 Python 常量与变量教程 可能你现在会产生疑惑&#xff0c;代码中的 print 代表什么意义&#xff1f;括号又是什么作用&#xff1f;为什么 hello world 外面有个双引号&#xff1f;没关系&#xff0c;下面我们就来了解 Python 语法的奥秘…

「漏洞复现」全新优客API接口管理系统 index/doc SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

java ssm 健康医馆管理系统 中医馆管理 健康平台 药店 源码jsp

一、项目简介 本项目是一套基于SSM的健康医馆管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#x…

Python - jieba库的使用

文章目录 jieba库概述jieba分词的三种模式jieba库的安装 jieba分词的原理jieba库常用函数实例 : 文本词频统计 jieba库概述 jieba是优秀的中文分词第三方库 中文文本需要通过分词获得单个的词语jieba是优秀的中文分词第三方库&#xff0c;需要额外安装jieba库提供三种分词模式…

一个简单的图像分类项目(九)并行训练的学习:多GPU的DP(DataParallel数据并行)

将电脑装成Ubuntu、Windows双系统&#xff0c;并在Ubuntu上继续学习。 在现代深度学习中&#xff0c;多主机多GPU训练已经变得非常常见&#xff0c;尤其是对于大规模模型和数据集。最简单和早期的并行计算比如NVIDIA的SLI&#xff0c;从NVIDIA 450系列驱动开始&#xf…

本草智选:中药实验管理的智能推荐

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足&#xff0c;创建了一个计算机管理中药实验管理系统的方案。文章介绍了中药实验管理系统的系…

凸优化理论和多模态基础模型研究

文章目录 摘要Abstract1. 拉格朗日对偶问题1.1 弱对偶问题1.2 强对偶问题&#xff08;P*D*&#xff09;1.3 KKT条件 2. 论文阅读3. 总结 摘要 本周从拉格朗日对偶理论出发&#xff0c;系统学习了优化问题中凸函数、强对偶条件以及 KKT 条件的应用&#xff0c;并将其与机器学习…

nginx+vconsole调试网页在vivo浏览器无法显示图片问题

一、问题描述 昨天测试小伙伴提了一个特殊的bug&#xff0c;在安卓vivo手机浏览器上访问网页&#xff0c;网页的图片按钮和录播图一闪而过后便消失不见&#xff1a; 二、问题排查 项目采用Nuxt框架&#xff0c;排查的方向大致如下&#xff1a; 1.其它手机浏览器是否有复现&am…

草本追踪:中药实验管理的数字化转型

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【Linux】虚拟地址空间,页表,物理内存

目录 进程地址空间&#xff0c;页表&#xff0c;物理内存 什么叫作地址空间&#xff1f; 如何理解地址空间的区域划分&#xff1f; 地址空间结构体 为什么要有地址空间&#xff1f; 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节&#xff0c;一…

集群聊天服务器(3)muduo网络库

目录 基于muduo的客户端服务器编程 muduo只能装在linux中&#xff0c;依赖boost库 客户端并不需要高并发 基于muduo的客户端服务器编程 支持epoll线程池&#xff0c;muduo封装了线程池 而且还有完善的日志系统 使用muduo库代码非常固定&#xff0c;基本就只有chatserver的类名…

【Python刷题】最少拐弯路线问题

题目描述 洛谷P1649 一、题目理解 首先&#xff0c;我们来看一下这道题目的要求。题目给定了一个 NN&#xff08;1≤N≤100&#xff09; 的方格&#xff0c;方格中的每个格子有不同的状态&#xff0c;用 . 表示可以行走的格子&#xff0c;x 表示不能行走的格子&#xff0c;…

在windows系统里面部署 Redis

在windows中下载安装REdis 1.下载mis 地址添加链接描述 然后直接下载安装然后点击你的库 2.然后选择好之后选择好路径就行了。 然后我们点击这个cli.exe文件然后双击打开输入 在命令框里输入&#xff1a; 如果显示的和图片显示的一样&#xff0c;则证明你已经在本地部署好了…

NTP博客

使用nmtui命令修改IP&#xff1a; 注意&#xff1a; 修改之后&#xff0c;要激活&#xff1a; nmcli connection up ens160 1、软件安装 #设置当前时区 [rootlocalhost ~]# timedatectl set-timezone Asia/Shanghai 1.1.配置国内阿里yum源 [rootredhat ~]# cd /etc/yum.r…

《Large-scale Multi-modal Pre-trained Models: A Comprehensive Survey》中文校对版

文章汉化系列目录 文章目录 文章汉化系列目录摘要引言2 背景2.1 传统深度学习2.2 自然语言处理中的预训练2.3 计算机视觉中的预训练2.4 音频与语音中的预训练 3 多模态预训练3.1 任务定义与关键挑战3.2 MM-PTM的优势3.3 预训练数据3.4 预训练目标3.5 预训练网络架构3.5.1 自注意…

从源码角度分析JDK动态代理

文章目录 前言一、JDK动态代理二、动态代理的生成三、invoke的运行时调用总结 前言 本篇从源码的角度&#xff0c;对JDK动态代理的实现&#xff0c;工作原理做简要分析。 一、JDK动态代理 JDK动态代理是运行时动态代理的一种实现&#xff0c;相比较于CGLIB &#xff0c;目标对象…

操作系统——计算机系统概述——1.5操作系统引导(开机过程)

操作系统引导&#xff1a; A.CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序&#xff08;先进行硬件自检&#xff0c;再开机&#xff09; B.将磁盘的第一块——主引导记录读入内存&#xff0c;执行磁盘引导程序&#xff0c;扫描分区表 C.从活动分…

推荐一本python学习书:《编程不难》

推荐理由 全面&#xff1a;把零基础Python编程、可视化、数学、数据、机器学习&#xff0c;融合在一起&#xff0c;循循渐进。 开源&#xff1a;PDF、Python代码、Jupyter文档&#xff0c;在github直接免费下&#xff01; 真实&#xff1a;提供大量真实场景下的数据&#xff…

数据结构与算法分析模拟试题及答案5

模拟试题&#xff08;五&#xff09; 一、单项选择题&#xff08;每小题 2 分&#xff0c;共20分&#xff09; &#xff08;1&#xff09;队列的特点是&#xff08;   &#xff09;。 A&#xff09;先进后出 B&#xff09;先进先出 C&#xff09;任意位置进出 D&#xff0…

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…