CompletableFuture高并发和线程池使用

文章目录

概要

多线程+CountDownLatch

线程池+CompletableFuture

CompletableFuture介绍


概要

在Java中,有些任务单线程执行时间长,一般会使用多线程增加并发提高运行速率。但很多情况下,需要所有子线程执行完,才能往下执行主线程,一般我们会使用这些方案:

1、多线程+CountDownLatch

2、线程池+CompletableFuture

多线程+CountDownLatch

public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(10);
 
        for (int i=0; i<4; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " 运行");
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        latch.countDown();
                    }
                }
            }).start();
        }
 
        System.out.println("等待子线程运行结束");
        latch.await(10, TimeUnit.SECONDS);
        System.out.println("子线程运行结束");
}
 

缺点:经常会忘记写latch.countDown();,或者latch.countDown()未执行,导致线程阻塞

线程池+CompletableFuture

1、多个子线程全部执行完,才能继续往下,阻塞主线程

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(8, 10,10, TimeUnit.SECONDS,new LinkedBlockingQueue<>(Integer.MAX_VALUE));

CompletableFuture<Void> task3 = CompletableFuture.runAsync(() -> {//TODO do something
}, threadPoolExecutor);CompletableFuture<Void> task5 = CompletableFuture.runAsync(() -> {//TODO do something
}, threadPoolExecutor);
CompletableFuture<Void> headerFuture = CompletableFuture.allOf(task3, task5);
headerFuture.join();

//继续主线程

2、多个子线程,每个单独异步执行,不阻塞主线程

CompletableFuture<Void> task3 = CompletableFuture.runAsync(() -> { //TODO do something }, threadPoolExecutor);

CompletableFuture<Void> task5 = CompletableFuture.runAsync(() -> { //TODO do something }, threadPoolExecutor);

3、exceptionally使用,处理异常

CompletableFuture.runAsync(() -> { //TODO do something }, threadPoolExecutor).exceptionally(e -> {if (e instanceof CompletionException || e instanceof ExecutionException) {if (e.getCause() != null) {e = e.getCause();}}return MxtyDdlCompletableDTO.builder().throwable(e).build();
});

4、多个子线程执行完成,统计处理结果

List<CompletableFuture<MxtyDdlCompletableDTO>> futureList = new ArrayList<>();
for (List<String> list : partition) {CompletableFuture<MxtyDdlCompletableDTO> future = CompletableFuture.supplyAsync(() -> {tableCountNumSql(dqlDecorator, list, map);return MxtyDdlCompletableDTO.builder().build();}, ddlTaskPool).exceptionally(e -> {if (e instanceof CompletionException || e instanceof ExecutionException) {if (e.getCause() != null) {e = e.getCause();}}return MxtyDdlCompletableDTO.builder().throwable(e).build();});futureList.add(future);
}
for (CompletableFuture<MxtyDdlCompletableDTO> future : futureList) {MxtyDdlCompletableDTO dto = future.join();if (dto == null || dto.getThrowable() != null) {}
}

CompletableFuture介绍

CompletableFuture是Java中的一个类,表示异步计算的未来结果。它是java.util.concurrent包的一部分,作为Future接口的增强功能在Java 8中引入的。
CompletableFuture类的一些关键特性包括:
1. 异步执行:CompletableFuture允许您异步执行任务,这意味着调用线程可以在不等待任务完成的情况下继续执行。
2. 完成阶段:CompletableFuture引入了CompletionStage的概念,它表示可能最终完成并返回值或异常的计算阶段。CompletionStage提供了将多个阶段链接在一起并定义它们之间依赖关系的方法。
3. 回调和可组合性:CompletableFuture支持回调,在未来完成时执行。您可以使用 `thenApply()` 、 `thenAccept()` 和 `thenRun()` 等方法附加回调。此外,CompletableFuture还提供了 `thenCompose()` 和 `thenCombine()` 等方法,用于组合多个未来。
4. 异常处理:CompletableFuture允许您处理计算过程中发生的异常,使用 `exceptionally()` 和 `handle()` 等方法。这些方法提供了处理和恢复异常的灵活性。
5. 异步组合器:CompletableFuture提供了一组称为"组合器"的方法,允许您组合多个未来、等待它们全部完成或选择第一个完成的未来。
总的来说,CompletableFuture为Java中的异步计算提供了强大而灵活的方式,使您能够编写更高效和响应性的代码。

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

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

相关文章

RabbitMQ工作模式2 整合springboot 和MQ高级特性

RabbitMQ工作模式 1.路由模式 创建交换机 , 连接队列 (生产者) public class MyTestExDirect {Testpublic void bbb() throws IOException, TimeoutException {ConnectionFactory connectionFactory new ConnectionFactory();//连接mqconnectionFactory.setUsername("…

可信区块链运行监测服务平台(TBM)发展研讨会在北京召开

2023年11月23日&#xff0c;由中国信息通信研究院、中国移动通信集团设计院有限公司、区块链服务网络&#xff08;BSN&#xff09;发展联盟共同主办的“可信区块链运行监测服务平台&#xff08;TBM&#xff09;发展研讨会”在北京成功举行。会议围绕区块链的监测与治理&#xf…

小程序如何实现下拉刷新?

一、全局下拉刷新 在app.json的window节点中&#xff0c;将enablePullDownRefresh设置为true&#xff1b; onPullDownRefresh: function () {console.log(下拉刷新);// 在这里编写数据更新的逻辑wx.stopPullDownRefresh(); // 数据更新完成后&#xff0c;调用该方法停止刷新}二…

vatee万腾的科技征途:Vatee数字化力量的新视野

在科技的浪潮中&#xff0c;Vatee万腾正展开一场引人注目的科技征途&#xff0c;以其独特的数字化力量描绘出一片新的视野。这不仅是一次技术的升级&#xff0c;更是一场对未来的全新探索&#xff0c;为我们带来了前所未有的数字化时代。 Vatee万腾以其卓越的技术实力和前瞻性的…

springboot实现数据脱敏

springboot实现数据脱敏 怎么说呢&#xff0c;写着写着发觉 ”这写的什么玩意“ 。 总的来说就是&#xff0c;这篇文章并不能解决数据脱敏问题&#xff0c;但以下链接可以。 SpringBoot中利用自定义注解优雅地实现隐私数据脱敏 然后回到本文&#xff0c;本来是想基于AOP代理&am…

PHP众筹系统源码+支持报名众筹+商品众筹+无偿众筹+市面上所有的众筹模式 附带完整的搭建教程

大家好啊&#xff0c;罗峰今天来给大家分好用的源码系统了。今天要给大家分享的是一款PHP众筹系统源码。众筹作为一种新型的融资方式&#xff0c;逐渐在市场上占据了重要的地位。从公益众筹到商品众筹&#xff0c;再到股权众筹&#xff0c;各种众筹模式层出不穷。然而&#xff…

ELK日志系统

&#xff08;一&#xff09;ELK 1、elk&#xff1a;是一套完整的日志集中处理方案&#xff0c;由三个开源的软件简称组成 2、E&#xff1a;ElasticSearch&#xff08;ES&#xff09;&#xff0c;是一个开源的&#xff0c;分布式的存储检索引擎&#xff08;索引型的非关系型数…

WebSocket--1.协议解析

目录 一.概念 二.建立流程 三.四大事件 五.js中建立ws链接 六.springboot中进行ws连接 1.首先&#xff0c;添加WebSocket的依赖到你的Spring Boot项目中。 2.接下来&#xff0c;创建一个WebSocket处理器 3.最后&#xff0c;创建一个配置类&#xff0c;注册该WebSocket处理…

后端整合Swagger+Knife4j接口文档

后端整合SwaggerKnife4j接口文档 接口文档介绍 什么是接口文档&#xff1a;写接口信息的文档&#xff0c;条接口包括&#xff1a; 请求参数响应参数 错误码 接口地址接口名称请求类型请求格式备注 为什么需要接口文档 who用&#xff1f;后端提供&#xff0c;前后端都需要使用…

python:类中静态方法,类方法和实例方法的使用与区别

python 类里面常用的方法有3个&#xff1a;静态方法(staticmethod)&#xff0c;类方法(classmethod)和实例方法(self) 1. 函数和方法 1.1 函数&#xff1a; 函数定义是由def()关键字定义 def fun():a "hello"return a# 函数调用 res fun() print(res)1.2 方法-…

ESXi 添加虚拟闪存 无可选设备问题排查

虚拟内存是计算机系统中的一种技术&#xff0c;它可以将计算机硬盘的一部分空间作为临时存储器来使用。当计算机的物理内存&#xff08;RAM&#xff09;不足时&#xff0c;操作系统可以将部分数据从内存移至硬盘的虚拟内存空间中&#xff0c;以释放内存供其他程序使用。虚拟内存…

uniapp基础-教程之HBuilderX配置篇-01

uniapp教程之HBuilderX配置篇-01 为什么要做这个教程的梳理&#xff0c;主要用于自己学习和总结&#xff0c;利于增加自己的积累和记忆。首先下载HBuilderX&#xff0c;并保证你的软件在C盘进行运行&#xff0c;最好使用英文或者拼音&#xff0c;这个操作是为了保证软件的稳定…

羊大师提示,别让坏习惯影响生活

羊大师提示&#xff0c;别让坏习惯影响生活 拖延是人们常常会遇到的一种坏习惯&#xff0c;它不仅浪费时间&#xff0c;还会对生活、工作和学习造成负面影响。为了改变这种坏习惯&#xff0c;我们需要采取一系列的措施&#xff0c;从根本上改变自己的生活方式。下面小编羊大师…

qt 5.15.2读取csv文件功能

qt 5.15.2读取csv文件功能 工程文件.pro 内容&#xff1a; QT core#添加网络模块 QT networkCONFIG c17 cmdline# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPREC…

bat脚本执行py文件

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

RK356x监控温度及CPU频率的服务(Ubuntu20.04)

1 脚本 touch /userdata/show_temps.sh添加内容 #! /bin/bash //压力测试 stress --cpu 4 & stress --cpu 4 &while true; dotypes($(cat /sys/class/thermal/thermal_zone*/type))temps($(cat /sys/class/thermal/thermal_zone*/temp))freqs($(cat /sys/bus/cpu/dev…

你知道如何使用队列实现栈吗?(C语言)

这时一道非常经典的题型&#xff0c;因为栈和队列的性质是相反的&#xff0c;队列的数据是先入先出&#xff0c;栈的数据是后入先出&#xff0c;那么怎样使用两个队列实现栈呢&#xff1f; 225. 用队列实现栈https://leetcode.cn/problems/implement-stack-using-queues/ 这是…

安卓开发学习---kotlin版---笔记(一)

Hello word 前言&#xff1a;上次学习安卓&#xff0c;学了Java开发&#xff0c;简单的搭了几个安卓界面。这次要学习Kotlin语言&#xff0c;然后开发安卓&#xff0c;趁着还年轻&#xff0c;学点新东西&#xff0c;坚持~ 未来的你会感谢现在努力的你~ 主要学习资料&#xff1a…

面试题库之JAVA基础篇(一)

java的特性 面向对象&#xff0c;能够使程序的耦合度更低&#xff0c;内聚性更高。平台无关性&#xff0c;因为java程序运行在jvm虚上。支持多线程。安全可靠。有丰富的类库。 面向对象 万物皆对象&#xff0c;将解决问题的各个元素抽象成对象&#xff0c;对象中包含解决单个…

leetcode算法之字符串

目录 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 最长公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//法一&#xff1a;两两比较string ret strs[0];for(int i1;i<strs.size();i){ret f…