CompletableFuture工具类使用

CompletableFuture工具类可以帮助实现Java并发编程中的任务编排

以上除了join用于阻塞调用该方法的线程并且接受CompletableFuture的返回值以外其它方法皆有Async异步和Executor指定线程池选项

对于supply,run,apply,accept的区别在于函数式编程的接口类型不同:

  • supply: Supplier<T> supplier => T get()
  • run:  Runnable runnable => void run()
  • apply:  Function<T, R> => apply(T t)
  • accept: Consumer<T> => void accept(T t)

对于以上方法,根据接受参数不同分为两类,一类参数接受如supply,run,apply,accept接口的实现类,另一类参数接受新的CompletableFuture:

FunctionInterfaceCompletableFuture
supplyAsyncthenCompose  
runAsyncthenCombine 
thenApplythenAcceptBoth
thenAcceptrunAfterBoth
thenRunapplyToEither
acceptEither
runAfterEither

thenCompose用于先执行A再执行B

thenCombine,thenAcceptBoth,runAfterBoth用于A,B同时执行

applyToEither,acceptEither,runAfterEither用于A,B谁先执行完就跳到C

 exceptionally,handle,whenComplete用于在并发编程中处理结果和异常:

exceptionally:

该方法仅处理异常情况:发生异常时,不会把异常抛出,而是由exceptionally处理结果返回

public static CompletableFuture exceptionally(int a, int b){return CompletableFuture.supplyAsync(() -> a/b).exceptionally(ex -> {System.out.println("ex:\t"+ex.getMessage());return 0;});
}

handle:

处理上一阶段返回值和异常,不会把异常抛出,而是由handle处理结果返回

public class CreateThread_FutureTask {public static void main(String[] args) {CompletableFuture<String> ctf = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(1000);return "1";} catch (InterruptedException e) {throw new RuntimeException(e);}}).applyToEither(CompletableFuture.supplyAsync(() -> {try {Thread.sleep(50);return String.valueOf(1/0);} catch (InterruptedException e) {throw new RuntimeException(e);}}), str -> {return str;}).handle((str,ex)->{if(ex!=null){return ex.getMessage();}else{return str;}});System.out.println(ctf.join());System.out.println("主线程能继续执行");}
}

whenComplete:

处理上一阶段返回值和异常,会把异常抛出

public static CompletableFuture whenComplete(int a, int b){return CompletableFuture.supplyAsync(() -> a/b).whenComplete((result, ex) -> {if (null != ex) {System.out.println("whenComplete error:\t"+ex.getMessage());}});
}

CompletableFuture.allOf和anyOf

allOf:接受CompletableFuture<?>...ctfs,等待全部执行完毕

anyOf:接受CompletableFuture<?>...ctfs,等待任意一个执行完毕

CompletableFuture[] dishes = IntStream.rangeClosed(1, 10).mapToObj(i -> new Dish("菜" + i, 1L)).map(dish -> CompletableFuture.runAsync(dish::make)).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(dishes).join();
System.out.println("菜全都做好了");

使用@Async指定线程池+CompletableFuture.completedFuture实现异步

CompletableFuture.completedFuture用于在已经知道返回值时生成CompletableFuture对象,直接使用当前方法的线程,可以与SpringBoot的@Async配合实现异步

@Configuration
public class ExecutorConfig {@Beanpublic Executor myAsyncTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(500);executor.setThreadNamePrefix("GithubLookup-");executor.initialize();return executor;}
}
@Async("myAsyncTaskExecutor")
@Override
public CompletableFuture<String> completeTask(int i) throws InterruptedException {log.info("当前线程为",Thread.currentThread().getName());Thread.sleep(1000*i);String value=String.valueOf(i);return CompletableFuture.completedFuture(value);
}

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

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

相关文章

tk 文本生成器

import random import tkinter as tk import ttkbootstrap as ttk from tkinter import messagebox import pyperclipdef wenben_run():def generate_text(original_text, length):# 去掉原始文本中的换行符和空格original_text original_text.replace(\n, )original_text or…

Windows11配置WSL2支持代理上网

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装WSL2分发版二、配置步骤三、测试总结 前言 说起来本来这个功能我也不需要的&#xff0c;只是最近突然有个需求就顺便研究了下&#xff0c;WSL2默认的网…

北京大学长安汽车发布毫米波与相机融合模型RCBEVDet:最快能达到每秒28帧

Abstract 三维目标检测是自动驾驶中的关键任务之一。为了在实际应用中降低成本&#xff0c;提出了利用低成本的多视角相机进行3D目标检测&#xff0c;以取代昂贵的LiDAR传感器。然而&#xff0c;仅依靠相机很难实现高精度和鲁棒性的3D目标检测。解决这一问题的有效方法是将多视…

C++入门基础(2)

目录 一、引用: 1、定义&#xff1a; 2、特性&#xff1a; 3、引用的使用&#xff1a; 4、const引用&#xff1a;控制权限 const引用定义: const引用可以接收3种对象&#xff1a; 1、正常对象&#xff1a; 2、临时对象&#xff1a; 3、const对象&#xff1a; 总结&…

C++笔试强训3

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 如图所示&#xff0c;如图所示p-3指向的元素是6&#xff0c;printf里面的是%s&#xff0c;从6开…

华为机试HJ108求最小公倍数

华为机试HJ108求最小公倍数 题目&#xff1a; 想法&#xff1a; 要找到输入的两个数的最小公倍数&#xff0c;这个最小公倍数要大于等于其中最大的那个数值&#xff0c;遍历最大的那个数值的倍数&#xff0c;最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…

OpenFWI代码

重点关注文章第4部分 一、代码模块概览 这一部分了解代码主要实现的功能有哪些。 二、运行 这一部分关注如何跑通。 三、数据集 12个数据集&#xff08;11个2D1个3D&#xff09; 对计算机而言&#xff0c;上述输入、输出维度大小是按次数定义的。 以“Vel&#xff0c;F…

线程池【开发实践】

文章目录 一、为什么要用线程池1.1 单线程的问题1.2 手动创建多线程的问题1.3 线程池的作用&#xff08;优点&#xff09;1.4 线程池的使用场景 二、线程池的基础知识2.1 线程池的核心组件2.2 JUC中的线程池架构2.3 线程池的配置参数2.4 线程池常见的拒绝策略&#xff08;可自定…

昇思25天学习打卡营第21天|LSTM+CRF序列标注

1. 学习内容复盘 概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。以命名…

汇川伺服 (4)FFT、机械特性、闭环、惯量、刚性、抑制振动

一、参数解释 二、FFT 三、机械特性分析 四、多级配方与对象字典 对机组网配方 对象字典 五、InoServoShop 主要是用于调试620P620N将压缩报解压后不需要安装就可以直接使用 六、InoDriveWorkShop 主要是调试660 670 810 520 等系列 惯量识别 Etune Stune 惯量比调试 大惯…

Error:sql: expected 1 arguments, got 2

一 背景 在测试一个API接口时&#xff0c;看到日志里面突然抛出一个错误&#xff1a;Error:sql: expected 1 arguments, got 2 看了下&#xff0c;对应的表里面是有相关数据的&#xff0c;sql语句放在mysql里面执行也是没问题&#xff01;那奇了怪了&#xff0c;为啥会产生这样…

git只列出本地分支

git只列出本地分支 git branch --list git强制删除本地分支 git branch -D_error: the branch dlx-test is not fully merged. -CSDN博客文章浏览阅读648次。git branch -d 可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删除特定分支。git删除远程remote分支…

算法之工程化内容(2)—— Git常用命令

目录 1. git初始化配置 2. 新建仓库 3. 工作区——>暂存区——>本地仓库 4. git reset回退版本 5. 查看差异 git diff 6. 删除文件git rm 7. .gitignore 8. vscode操作git 9. git分支、合并和删除 10. 解决合并冲突 11. 回退和rebase 12. 添加远程仓库 参考链接&#xff…

Linux 网络--TCP协议收包流程(NAPI机制)

Linux 网络--TCP协议收包流程&#xff08;NAPI机制&#xff09; 平台环境简介&#xff1a;宿主机: ubuntu18.04Linux内核源码版本: Linux-4.15网卡驱动: Intel e1000 &#xff08;ubuntu 虚拟机默认网卡驱动&#xff09;协议&#xff1a;TCP协议&#xff0c;本文分析收包过程 本…

【线程状态-2】

1、线程礼让 &#xff08;1&#xff09;礼让线程&#xff0c;让当前正在执行的线程暂停&#xff0c;但不阻塞 &#xff08;2&#xff09;将线程从运行状态转为就绪状态 &#xff08;3&#xff09;让cpu重新调度&#xff0c;礼让不一定成功&#xff01;看cpu心情 package st…

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网&#xff08;Single Pair Ethernet&#xff0c;简称SPE&#xff09;是一种新兴的以太网技术&#xff0c;它通过一对双绞线实现数据传输&#xff0c;支持PoDL&#xff08;Power over Data Line&#xff09;技术&#xff0c;为终端设备提供电力供…

windows JDK11 与JDK1.8自动切换,以及切换后失效的问题

1.windows安装不同环境的jdk 2.切换jdk 3.切换失败 原因&#xff1a;这是因为当我们安装并配置好JDK11之后它会自动生成一个环境变量&#xff08;此变量我们看不到&#xff09;&#xff0c;此环境变量优先级较高&#xff0c;导致我们在切换回JDK8后系统会先读取到JDK11生成的…

Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的中小型企业财务管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单…

Spark实现电商消费者画像案例

作者/朱季谦 故事得从这一张图开始说起—— 可怜的打工人准备下班时&#xff0c;突然收到领导发来的一份电商消费者样本数据&#xff0c;数据内容是这样的—— 消费者姓名&#xff5c;年龄&#xff5c;性别&#xff5c;薪资&#xff5c;消费偏好&#xff5c;消费领域&#x…

CentOS 7:停止更新后如何下载软件?

引言 CentOS 7 是一个广受欢迎的 Linux 发行版&#xff0c;它为企业和开发者提供了一个稳定、安全、且免费的操作系统环境。然而&#xff0c;随着时间的推移&#xff0c;CentOS 7 的官方支持已经进入了维护阶段&#xff0c;这意味着它将不再收到常规的更新和新功能&#xff0c;…