CompletableFuture实现多任务异步执行

CompletableFuture实现多任务异步执行

CountDownLatch可以实现多任务并行,最后收集结果。业务中更广泛的使用CompletableFuture来实现多任务并行

描述

CompletableFuture.supplyAsync() 是 Java 中用于异步执行任务的一种方法。它返回一个CompletableFuture 对象,该对象表示一个异步计算的结果。supplyAsync() 方法接受一个 Supplier 函数式接口作为参数,该接口表示一个无参数、有返回值的函数。

使用

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
public static <U> CompletableFuture<U>supplyAsync(Supplier<U> supplier, Executor executor)
第一个方法使用默认的 ForkJoinPool.commonPool() 作为执行器。
第二个方法允许你指定一个自定义的 Executor

使用demo

 public static void main(String[] args) {List<CompletableFuture<Integer>> completableFutureList = new ArrayList<>();long t1 =System.currentTimeMillis();CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> {int time = 6;try {//处理业务TimeUnit.SECONDS.sleep(time);} catch (InterruptedException e) {throw new RuntimeException(e);}//返回业务结果return time;},threadPool);CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(() -> {int time = 8;try {TimeUnit.SECONDS.sleep(time);} catch (InterruptedException e) {throw new RuntimeException(e);}return time;},threadPool);CompletableFuture<Integer> completableFuture3 = CompletableFuture.supplyAsync(() -> {int time = 10;try {TimeUnit.SECONDS.sleep(time);} catch (InterruptedException e) {throw new RuntimeException(e);}return time;});CompletableFuture<Integer> completableFuture4 = CompletableFuture.supplyAsync(() -> {int time = 13;try {TimeUnit.SECONDS.sleep(time);} catch (InterruptedException e) {throw new RuntimeException(e);}return time;},threadPool);CompletableFuture<Integer> completableFuture5 = CompletableFuture.supplyAsync(() -> {int time = 20;try {TimeUnit.SECONDS.sleep(time);} catch (InterruptedException e) {throw new RuntimeException(e);}return time;},threadPool);CompletableFuture<Integer> completableFuture6 = CompletableFuture.supplyAsync(() -> {int time = 25;try {TimeUnit.SECONDS.sleep(time);} catch (InterruptedException e) {throw new RuntimeException(e);}return time;},threadPool);completableFutureList.add(completableFuture1);completableFutureList.add(completableFuture2);completableFutureList.add(completableFuture3);completableFutureList.add(completableFuture4);completableFutureList.add(completableFuture5);completableFutureList.add(completableFuture6);//用于等待一组 CompletableFuture 全部完成的方法.join() 方法用于阻塞当前主线程,直到 CompletableFuture 完成CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[0])).join();// 汇总所有结果List<Integer> dataList = new ArrayList<>();for (CompletableFuture<Integer> future : completableFutureList) {try {Integer time = future.get();dataList.addAll(Collections.singleton(time));} catch (InterruptedException | ExecutionException e) {}}long t2 =System.currentTimeMillis();System.out.println("6个任务总用时:"+(t2-t1)+"毫秒");System.out.println(dataList);}

线程池的定义

 static Executor threadPool = new ThreadPoolExecutor(10,//核心活跃线程数,类比银行两个柜台一直保持营业30 ,//线程池最大大小,类比银行共25个柜台可以营业2L,//超时回收空闲的线程,类比有三个非活跃线程处于活跃状态,在一定时间还未接到任务就进入非活跃状态(就是不营业了)TimeUnit.SECONDS,//时间单位new ArrayBlockingQueue<>(3),//存放等待任务的队列,类比为银行的候客区,不指定大小的话就是最大整数Executors.defaultThreadFactory(),// 线程工厂,不修改!用来创建new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略,如果线程满了,线程池就会使用拒绝策略);

最终输出:
6个任务总用时:25029毫秒
[6, 8, 10, 13, 20, 25]

注意:
①join是为了让主线程等待所有子任务都执行完
②线程池的定义要注意,核心线程太小的话,会在核心线程用完时,进入队列等待。除非队列装满才会唤醒非核心线程

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

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

相关文章

C语言实践:实现插入排序

开篇 本篇文章的题目来源是《编程珠玑》第11章【排序】的第一个小节。不知不觉&#xff0c;已经看到第11章了呀。 主体 想到排序&#xff0c;想必大家第一时间&#xff0c;想到的都会是下面的这种方式。 for i [1, n]for (j i; j > 0 && x[j-1] > x[j]; j--)s…

idea | 搭建 SpringBoot 项目之配置 Maven

目录 1 配置 Maven1.1 打开 settings.xml 文件1.2 配置本地仓库路径1.3 配置中央仓库路径1.4 配置 JDK 版本1.5 重新下载项目依赖 2 配置 idea2.1 在启动页打开设置2.2 配置 Java Compiler2.3 配置 File Encodings2.4 配置 Maven2.5 配置 Auto Import2.6 配置 Cod…

Ubuntu学习笔记 - Day2

文章目录 学习目标&#xff1a;学习内容&#xff1a;学习笔记&#xff1a;Linux系统启动过程内核引导运行init运行级别系统初始化建立终端用户登录系统 Ubuntu关机关机流程相关命令 Linux系统目录结构查看目录目录结构 文件基本属性读写权限命令 下载文件的方法安装wget工具下载…

30-手动准备地图包

map包遵循特定的文件夹结构&#xff0c;并且必须包含描述该结构的.json文件。我们的自动地图导入过程自动创建这个.json文件&#xff0c;但您也可以选择自己准备它。包括您自己的.json文件将覆盖传递给make import命令的任何参数。 标准地图 为标准地图创建文件夹结构 1.…

「Qt Widget中文示例指南」如何创建一个窗口标志?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 窗口标志要么是类型…

【GeoJSON在线编辑平台】(1)创建地图+要素绘制+折点编辑+拖拽移动

前言 简单实现一下地图加载、要素绘制、折点编辑和拖拽移动。打算统一都写到一个类里面。 为了快速实现&#xff0c;直接去参考了官方案例。 创建地图 pnpm install ol加载地图 在这里&#xff0c;我们创建一个 mapView.js 的文件专门用来放地图和视图相关的方法&#xff0…

从0开始linux(23)——文件(4)磁盘定址方式

欢迎来到博主的专栏&#xff1a;从0开始Linux 博主ID&#xff1a;代码小豪 文章目录 CHS寻址模式LBA寻址 前面我们介绍了文件管理系统&#xff0c;我们说&#xff0c;当我们使用系统调用open时&#xff0c;操作系统会将磁盘当中的文件加载到内存当中&#xff0c;创建一个struct…

wireshark工具使用

复制数据 1.右键展开整帧数据 2.复制“所有可见项目” mark标记数据 标记&#xff1a; 跳转&#xff1a; 保存成文件&#xff1a; 文件–>导出特定分组—>Marked packets only

固定宽度--文字多少不一样--需要文字充满整个宽度

固定宽度–文字多少不一样–需要文字充满整个宽度 1.场景–登陆页面 这样显示显然不太行 那我们想要是这种情况吗–用户名和密码都充满真个宽度的div 2.代码实现—其中一个重要属性最为关键 text-align-last: justify css <style>.user{width:60px;background-colo…

艾体宝产品丨加速开发!Redis Copilot智能助手上线

我们最近发布了 Redis Copilot&#xff0c;旨在帮助开发者更加高效地使用 Redis 构建应用。提升应用性能&#xff0c;简化构建过程是我们不懈的追求。Redis Copilot 正是为此而生的人工智能助手&#xff0c;助力开发者迅速掌握 Redis 的使用技巧。现在您可以在 Redis Insight 中…

4种鼓励创业创新的方法

随着市场趋于饱和&#xff0c;许多企业&#xff0c;尤其是初创企业&#xff0c;很难在竞争中保持领先地位。技术为企业彻底改变其营销和管理策略铺平了道路。另一个经过实践检验的成功渗透特定市场的方法是在办公室内部激发创新&#xff0c;从员工到品牌皆如此。 那么究竟如何…

Spark的yarn集群环境搭建

一.为什么要搭建yarn集群 为什么要将Spark的程序运行在YARN上&#xff0c;不运行在自带的 Standalone集群上&#xff1f; 1、统一化资源管理 Standalone是Spark专用的资源管理集群&#xff0c;只能用于运行 Spark程序 YARN是功能的分布式资源管理平台&#xff0c;可以运行各种分…

【react使用AES对称加密的实现】

react使用AES对称加密的实现 前言使用CryptoJS库密钥存放加密方法解密方法结语 前言 项目中要求敏感信息怕被抓包泄密必须进行加密传输处理&#xff0c;普通的md5加密虽然能解决传输问题&#xff0c;但是项目中有权限的用户是需要查看数据进行查询的&#xff0c;所以就不能直接…

登录功能设计(php+mysql)

一 登录功能 1. 创建一个登录页面&#xff08;login.php&#xff09;&#xff0c;包含一个表单&#xff0c;用户输入用户名和密码。 2. 在表单的提交事件中&#xff0c;使用PHP代码处理用户输入的用户名和密码。 3. 首先&#xff0c;连接MySQL数据库。然后&a…

ReactPress 是什么?

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是什么&#xff1f; ReactPress 是使用React开发的开源发布平台&#xff0c;用户可以在支持React和MySQL数据库的服务器上架设属于自己的博客、网站。也可以把 ReactP…

ai外呼机器人的作用有哪些?

ai外呼机器人具有极高的工作效率。日拨打成千上万通不是问题&#xff0c;同时&#xff0c;机器人还可以快速筛选潜在客户&#xff0c;将更多精力集中在有价值的客户身上&#xff0c;进一步提升营销效果。183-3601-7550 ai外呼机器人的作用&#xff1a; 1、搭建系统&#xff0c…

福禄克DTX,DSX系列内置标准以及生成的测试报告如何解读?

今日,接到一些朋友的询问?虽然使用了很长一段时间的FLUKE DSX-5000或者DSX-8000,但是对于测试标准和测试生成的报告一知半解,借此咱们一块屡屡清楚。 1,经常有的朋友拿到设备后,第一时间就问,咱们福禄克内置的标准的多少?我线的参数(被测的铜缆)达到多少db,才能算过…

我与Linux的爱恋:磁盘的存储管理

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 磁盘的存储管理 磁盘的存储管理 在我们日常生活中&#xff0c;我们要打开很多文件(要打开这个文件需要先找到这个文件->要在磁盘中先找到->通过文件路径文件…

git原理与上传

言&#xff1a; git是一个软件&#xff0c;gitee/github是一个网站&#xff0c;这里有什么联系吗&#xff1f;我们身为一个程序员不可能不知道github&#xff0c;但是毕竟这是外国的网站&#xff0c;我们不翻墙的情况下&#xff0c;是无法访问的(或者就是太慢了&#xff0c;或…

Python基础学习_01

目录 1、注释 2、数字和数学计算 3、变量 4、字符串 5、打印 6、本节总结 1、注释 • 什么是注释&#xff1f; 1&#xff09;注释就是用自然语言向代码阅读者说明代码的功能和意义 • 注释 1&#xff09;单行注释使用 # 为开头&#xff1b;并且不能换行…