CompletableFuture 场景DEMO代码展示

自定义线程池

自定义线程池好处参考:

线程是稀缺资源,如果被无限制的创建,不 仅会消耗系统资源,还会降低系统的稳定性,因此Java中提供线程池对线程进行统一分配、 调优和监控的框架。

自定义线程池ThreadPoolExecutor_自定义threadpoolexecutor-CSDN博客

代码:

package com.insigma.business.dwbt.qyssyh.help;/*** <简述>* <详细描述>** @author syf* @date 2024年06月24日 16:58*/import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;@Configuration
public class ThreadPoolConfig {/*** 线程池维护线程所允许的空闲时间(单位秒)*/private int keepAliveSeconds = 120;/*** 时间单位,这里设为秒*/private final TimeUnit unit = TimeUnit.SECONDS;/*** 核心线程数 = cpu 核心数 + 1*/private final int core = Runtime.getRuntime().availableProcessors() + 1;/*** 最大线程数,可以根据具体需求调整*/private final int maximumPoolSize = 2 * Runtime.getRuntime().availableProcessors() + 1;/*** 队列最大长度*/private int queueCapacity = 150;/*** 阻塞队列,这里使用有界LinkedBlockingQueue* 设置容量为1000,超过这个数量的元素将被阻塞,直到队列中有可用空间*/private final BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(queueCapacity);@Beanpublic ThreadPoolExecutor threadPoolTaskExecutor() {ThreadPoolExecutor executor = new ThreadPoolExecutor(core,maximumPoolSize,keepAliveSeconds,unit,workQueue);/** ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。* ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。* ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)* ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务,如果执行器已关闭,则丢弃.*/executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}}

 

一、多线程循环处理数据

场景:集合总数1万条,每次处理2000条。则需要开启五个线程处理场景。

       //dd38NO  假设一万条数据集合List<DD38DTO> dd38NO = new ArrayList();// 每批处理的数据量(限制10000条数据,最多调用五个线程)int batchSize = 2000;// 计算完整的批次数量(没有余数的批次)int totalBatches = dd38NO.size() / batchSize;// 检查是否有余数来确定是否需要额外的批次if (dd38NO.size() % batchSize != 0) {// 如果有余数,则增加一个批次来处理剩余的记录totalBatches++;}// 存放所有CompletableFuture的列表List<CompletableFuture<List<DD38DTO> >> futuresAll = new ArrayList<>();// 循环处理每个批次for (int i = 0; i < totalBatches; i++) {int start = i * batchSize;int end = Math.min(start + batchSize, dd38NO.size());List<DD38DTO> dd38DTOS = dd38NO.subList(start, end);// 提交异步任务到线程池CompletableFuture<List<DD38DTO> > future = CompletableFuture.supplyAsync(() -> {//checkPersons   业务逻辑List<DD38DTO> list = checkPersons(dd38DTOS);return  list;}, executor).exceptionally(ex -> {log.error("发生异常: " , ex.getMessage());return Collections.EMPTY_LIST;});futuresAll.add(future);}// 等待所有异步任务完成CompletableFuture.allOf(futuresAll.toArray(new CompletableFuture[0])).join();//allList 处理完的集合List<DD38DTO> allList = new ArrayList<>();for (CompletableFuture<List<DD38DTO> > future : futuresAll) {List<DD38DTO> dd38DTOS =  dd38DTOS = future.get();allList.addAll(dd38DTOS);}

 二、查询商品

场景:查询商品info

之后根据商品id ,分别查询sku、 spu  等信息

sku、 spu 操作则可以异步执行。

 @Overridepublic List<SkuInfoEntity> getSkusBySpuId(Long spuId) {return this.list(new QueryWrapper<SkuInfoEntity>().eq("spu_id", spuId));}@Overridepublic SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {SkuItemVo skuItemVo = new SkuItemVo();//开启线程 supplyAsync返回结果CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {//1、sku基本信息的获取  pms_sku_infoSkuInfoEntity info = this.getById(skuId);skuItemVo.setInfo(info);return info;}, executor);//infoFuture 结束 异步执行CompletableFuture<Void> saleAttrFuture = infoFuture.thenAcceptAsync((res) -> {//3、获取spu的销售属性组合List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrBySpuId(res.getSpuId());skuItemVo.setSaleAttr(saleAttrVos);}, executor);//infoFuture 结束 异步执行CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((res) -> {//4、获取spu的介绍    pms_spu_info_descSpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getById(res.getSpuId());skuItemVo.setDesc(spuInfoDescEntity);}, executor);//infoFuture 结束 异步执行CompletableFuture<Void> baseAttrFuture = infoFuture.thenAcceptAsync((res) -> {//5、获取spu的规格参数信息List<SpuItemAttrGroupVo> attrGroupVos = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());skuItemVo.setGroupAttrs(attrGroupVos);}, executor);// Long spuId = info.getSpuId();// Long catalogId = info.getCatalogId();//2、sku的图片信息    pms_sku_images   新开 runAsync 没有返回结果CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {List<SkuImagesEntity> imagesEntities = skuImagesService.getImagesBySkuId(skuId);skuItemVo.setImages(imagesEntities);}, executor);/*CompletableFuture<Void> seckillFuture = CompletableFuture.runAsync(() -> {//3、远程调用查询当前sku是否参与秒杀优惠活动R skuSeckilInfo = seckillFeignService.getSkuSeckilInfo(skuId);if (skuSeckilInfo.getCode() == 0) {//查询成功SeckillSkuVo seckilInfoData = skuSeckilInfo.getData("data", new TypeReference<SeckillSkuVo>() {});skuItemVo.setSeckillSkuVo(seckilInfoData);if (seckilInfoData != null) {long currentTime = System.currentTimeMillis();if (currentTime > seckilInfoData.getEndTime()) {skuItemVo.setSeckillSkuVo(null);}}}}, executor);*///等到所有任务都完成//CompletableFuture.allOf(saleAttrFuture,descFuture,baseAttrFuture,imageFuture,seckillFuture).get();CompletableFuture.allOf(saleAttrFuture,descFuture,baseAttrFuture,imageFuture).get();return skuItemVo;}

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

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

相关文章

Talking Web

1. curl 1.1 http curl http://127.0.0.1:80 向目标主机端口发送http请求 1.2 httphead curl -H “Host: 18ed3df584cd48328b5839443aa7b42b” http://127.0.0.1:80 1.3 httppath curl http://127.0.0.1:80/853c64cd218f80d0a59665666fb2ab80 1.4 URL编码路径 &#xff0…

LeetCode 2732. 找到矩阵中的好子集

一、题目描述 给定一个 m x n 的整数矩阵 mat 和一个整数 k&#xff0c;我们需要找到一个大小为 k 的子集 rows&#xff0c;使得这个子集对应的行在矩阵 mat 中构成的子矩阵中&#xff0c;所有元素之和最大。返回这个子矩阵中所有元素之和的最大值。 注意&#xff1a; 子集 …

天天大爆推文玩法营销号软件下载地址

天天大爆推文玩法营销号软件下载地址 天天大爆推文玩法营销号是一种营销策略&#xff0c;通过在社交媒体上发布频繁的推文来吸引关注和增加品牌曝光度。以下是一些可以用于天天大爆推文玩法营销号的策略&#xff1a; 营销号工具使用教程&#xff1a;https://iimenvrieak.feis…

数据结构之前缀树

写在前面 源码 。 前缀树&#xff0c;又叫做trie树&#xff0c;字典树&#xff0c;是一种多叉的树&#xff0c;一般用于单词前缀匹配的相关场景中&#xff0c;比如&#xff1a; 本文看下使用Java如何来实现这种数据结构。 1&#xff1a;基本介绍 思想&#xff1a;空间换时…

典型传感器简介及驱动安装

双目视觉传感器 Indemind 传感器简介 INDEMIND M1 是专为开发者提供的一款硬件&#xff0c;采用“双目摄像头IMU”多传感器融合架构与 微秒级时间同步机制&#xff0c;为视觉 SLAM 研究提供精准稳定数据源&#xff0c;以满足 SLAM 研究、导航及 避障开发、视觉动作捕捉开发、…

C++基础编程100题-014 OpenJudge-1.3-12 计算球的体积

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/12/ 描述 对于半径为r的球&#xff0c;其体积的计算公式为$ V4/3*πr^3 $&#xff0c;这里取π 3.14。 现给定r&#xff0c;求V。 输入 输入为一个不超过100的非负实数&#xff0c;即球半径&#xff0…

C# 高频面试题

C# 初级面试题及详细解答 1. C#中的值类型和引用类型的区别是什么&#xff1f; 解答: 值类型存储在堆栈上&#xff0c;直接包含数据&#xff1b;引用类型存储在堆上&#xff0c;存储的是对象的引用。值类型包括基本类型如 int、float 和 struct&#xff1b;引用类型包括 clas…

Perl编程探索:深入理解数组变量

Perl语言以其在文本处理和系统管理任务中的强大能力而受到广泛欢迎。在Perl中&#xff0c;数组是处理多个值集合的一种关键数据结构。本文将深入探讨Perl中的数组变量&#xff0c;包括它们的声明、初始化、访问和操作。 Perl数组的基本概念 在Perl中&#xff0c;数组可以用来…

FL Studio 21 集成了音频剪辑和增益控制,你可以更快、更精确地控制音频电平,包括自动交叉淡入淡出及更多功能

以通过控制色调、饱和度、亮度、文本、仪表和步进序列器的颜色来改变你的DAW外观&#xff0c; DAW“情绪主题”控制&#xff0c;水果编曲将变得与众不同。 更快的音频编辑 FL Studio 21 集成了音频剪辑包络和增益控制&#xff0c;你可以更快、更精确地控制音频电平&#xff0c…

代码随想录算法训练营第十四天| 110.平衡二叉树 | 257. 二叉树的所有路径 | 404.左叶子之和 | 222.完全二叉树的节点个数

110.平衡二叉树 &#xff08;优先掌握递归&#xff09; 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;后序遍历求高度&#xff0c;高度判断是否平衡 | LeetCode&#xff1a;110.平衡二叉树_哔哩哔哩_bilibili 1. 不知道咋做。 2. 在求二叉树的高度的代码上改&#xff…

学习面向对象前--Java基础练习题

前言 写给所有一起努力学习Java的朋友们&#xff0c;敲代码本身其实是我们梳理逻辑的一个过程。我们在学习Java代码的过程中&#xff0c;除了需要学习Java的一些基本操作及使用&#xff0c;更重要的是我们需要培养好的逻辑思维。逻辑梳理好之后&#xff0c;我们编写代码实现需要…

aws的alb,多个域名绑定多个网站实践

例如首次创建的alb负载均衡只有www.xxx.com 需要添加 负载 test2.xxx.com aws的Route 53产品解析到负载均衡 www.xxx.com 添加CNAME&#xff0c;到负载均衡的dns字段axx test2.xxx.com 添加CNAME&#xff0c;到负载均衡的dns字段axx 主要介绍目标组和规则 创建alb就不介…

windows系统命令设置ipv4参数(手动、自动)、设置DNS解析、命令设置计算机主机名

命令设置ipv4网络参数。 命令提示符中使用netsh命令为网络接口&#xff08;网络连接&#xff09;配置ipv4参数。命令格式如下&#xff1a; netsh interface ip set address "接口名称" static ip地址 子网掩码 [默认网关] 案例&#xff1a; 将本地 "以太网…

Spring底层原理之FactoryBean Bean工厂 单例对象 多例对象

FactoryBean 在 Spring Framework 中&#xff0c;FactoryBean 是一个用于创建其他 Bean 实例的特殊工厂 Bean。它允许开发者自定义 Bean 的创建逻辑&#xff0c;从而更加灵活地管理和配置 Bean 的实例化过程。 FactoryBean 接口 FactoryBean 接口是 Spring 框架中的一个重要…

推送电子邮箱与其他营销手段如何有效结合?

推送电子邮箱的效果如何&#xff1f;怎么优化邮件推送的策略&#xff1f; 将推送电子邮箱与其他营销手段有效结合&#xff0c;可以显著提升营销效果和用户体验。AokSend将探讨如何将推送电子邮箱与社交媒体营销、内容营销、搜索引擎优化&#xff08;SEO&#xff09;等手段相结…

ubuntu22.04安装AFLGo

git clone gitgithub.com:aflgo/aflgo.git cd aflgo export AFLGO$PWD sudo ./build.sh然后 上面的是官方流程 主要看下面 把build.sh里三个wget的先下好&#xff0c;放在对应路径&#xff0c;然后把他的注释掉&#xff0c;不然下载时间很长很长。然后下python那边容易报错&a…

ArkTS自定义组件

一、自定义组件基本结构 // 定义自定义组件 ButtonCom.ets Component export struct BtnCom{State msg: string "按钮";build() {Row(){Text(this.msg).onClick(() > {this.msg "测试"})}} } // 引入自定义组件 import {BtnCom} from "./Butto…

动物常见图像的图像分类数据集

常见动物图像分类数据集 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zZnCUZuNlX6MjuZImlDjTw?pwd03b9 提取码&#xff1a;03b9 数据集信息介绍&#xff1a; 文件夹 大象 中的图片数量: 1446 文件夹 松鼠 中的图片数量: 1862 文件夹 河马 中的图片数量:…

理解和处理不同类型的上下文的新型的语言模型ReALM

在人类的日常交流中&#xff0c;模糊的代词如“他们”或“那个”常常出现&#xff0c;它们的意义通常依赖于上下文才能明确。这种上下文的理解对于对话助手来说至关重要&#xff0c;因为它们旨在提供一种自然的交流体验。然而&#xff0c;现有的对话助手在处理这类模糊引用时往…

SAP查看接口日志

大部分SAP项目都会与其他外围系统进行集成&#xff0c;那么日常工作中&#xff0c;如果遇到接口传输问题&#xff0c;我们应该怎样查询呢&#xff1f; 也许这篇文章可以稍微解答一些基础的内容。 1、事务代码SXI_MONITOR检查接口日志&#xff1a; 执行的起止日期默认带出&…