高性能Java并发编程:线程池与异步编程最佳实践
Future模式与CompletableFuture
处理异步任务时,Future与CompletableFuture是强有力的工具。
实战案例:多API并行调用
假设我们需要从多个微服务获取数据,然后合并结果:
public UserProfileDto getUserProfile(Long userId) {long startTime = System.currentTimeMillis();// 并行获取用户基本信息CompletableFuture<UserBasicInfo> basicInfoFuture = CompletableFuture.supplyAsync(() -> userService.getBasicInfo(userId));// 并行获取用户订单信息CompletableFuture<List<Order>> ordersFuture = CompletableFuture.supplyAsync(() -> orderService.getUserOrders(userId));// 并行获取用户积分信息CompletableFuture<PointsInfo> pointsFuture = CompletableFuture.supplyAsync(() -> pointsService.getUserPoints(userId));// 等待所有任务完成并合并结果UserProfileDto result = CompletableFuture.allOf(basicInfoFuture, ordersFuture, pointsFuture).thenApply(v -> {UserBasicInfo basicInfo = basicInfoFuture.join();List<Order> orders = ordersFuture.join();PointsInfo points = pointsFuture.join();return new UserProfileDto(basicInfo, orders, points);}).join();long endTime = System.currentTimeMillis();log.info("获取用户档案总耗时: {}ms", (endTime - startTime));return result;
}
使用CompletableFuture可以将原本串行执行的三个服务调用并行化,显著提升响应速度。
线程池的正确使用姿势
线程池是Java并发编程的重要组件,但使用不当会导致严重问题。
线程池核心参数详解
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, // 核心线程数maximumPoolSize, // 最大线程数keepAliveTime, // 空闲线程存活时间timeUnit, // 时间单位workQueue, // 工作队列threadFactory, // 线程工厂rejectedExecutionHandler // 拒绝策略
);
真实踩坑:线程池参数配置不当
某支付系统中,开发人员使用了这样的线程池:
// 错误示范
ExecutorService executor = Executors.newFixedThreadPool(10);
在高峰期,系统大量请求堆积,导致内存溢出。原因是newFixedThreadPool使用的是无界队列LinkedBlockingQueue,请求不断堆积最终耗尽内存。
正确的做法是明确指定队列大小,并设置合适的拒绝策略:
int corePoolSize = 10;
int maximumPoolSize = 20;
long keepAliveTime = 60L;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(1000);
ThreadFactory threadFactory = new CustomThreadFactory("payment-thread-");
RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();ExecutorService executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
这个配置限制了队列大小,并使用CallerRunsPolicy作为拒绝策略,在系统过载时让调用者线程执行任务,起到限流作用。
总结
点赞关注「佩奇的技术笔记」,获取更多并发编程实战技巧!
相关文章:
高性能Java并发编程:线程池与异步编程最佳实践
Future模式与CompletableFuture 处理异步任务时,Future与CompletableFuture是强有力的工具。 实战案例:多API并行调用 假设我们需要从多个微服务获取数据,然后合并结果: public UserProfileDto getUserProfile(Long userId) {…...
【Java篇】一气化三清:类的实例化与封装的智慧之道
文章目录 类和对象(中)五、对象的构造及初始化5.1 如何初始化对象5.2 构造方法5.2.1 构造方法的概念5.2.2 构造方法的特性 5.3 默认初始化5.4 就地初始化 六、封装6.1 封装的概念6.2 访问限定符6.3 封装扩展之包6.3.1 包的概念6.3.3导入包6.3.3全类名6.3…...
VMware上调整centos终端的背景颜色
目录 1. 正常打开一个终端,背景颜色默认为白色 2. 在打开的终端页面上右击,选择“配置文件首选项” 3. 取消默认勾选的 “使用系统主题中的颜色” 即可 1. 正常打开一个终端,背景颜色默认为白色 2. 在打开的终端页面上右击,选择…...
Netty源码—1.服务端启动流程二
大纲 1.服务端启动整体流程及关键方法 2.服务端启动的核心步骤 3.创建服务端Channel的源码 4.初始化服务端Channel的源码 5.注册服务端Channel的源码 6.绑定服务端端口的源码 7.服务端启动流程源码总结 5.注册服务端Channel的源码 (1)注册服务端Channel的入口 (2)注册…...
Latex2024安装教程(附安装包)Latex2024详细图文安装教程
文章目录 前言一、Latex2024下载二、Texlive 2024安装教程1.准备安装文件2.启动安装程序3.配置安装选项4.开始安装5.安装完成6.TeX Live 2024 安装后确认 三、Texstudio 安装教程1.准备 Texstudio 安装2.启动 Texstudio 安装向导3.选择安装位置4.等待安装完成5.启动 Texstudio6…...
用了Cline和华为云的大模型,再也回不去了
这两年AI火热,受影响最大的还是程序员群体,因为编程语言是高度形式化的,完全可以用BNF等形式精确地定义,不像自然语言那样,容易出现歧义。另外开源是软件界的潮流,GitHub上有海量的开源代码可供AI来训练&am…...
解码软件需求的三个维度:从满足基础到创造惊喜
在软件开发的世界里,用户需求就像一张复杂的地图,指引着产品前进的方向。但并非所有需求都能带来同样的价值——有些是产品生存的“氧气”,有些是吸引用户的“磁石”,还有一些则是让人眼前一亮的“魔法”。如何区分它们࿱…...
<table>内有两行<tr>,第一行设定高度为60,剩余第二行,和右侧元素高度补齐。
实现 <table> 内第一行高度设定为 60px,第二行和右侧元素高度补齐的效果,你可以通过 CSS 样式来控制。示例: 为第一行 <tr> 设置固定高度 60px。对于右侧元素,假设它是一个 <div> 或者其他容器,将其…...
详细解析格式化消息框的代码
书籍:《windows程序设计(第五版)》的开始 环境:visual studio 2022 内容:格式化消息框 说明:以下内容大部分来自腾讯元宝。 封装MessageBoxPrintf 在MessageBoxPrintf()中处理可变参数,通过va_list机制,…...
过往记录系列 篇四:年报月行情历史梳理
文章目录 系列文章市场整体走势板块表现资金面与成交量市场风格系列文章 过往记录系列 篇一:牛市板块轮动顺序梳理 过往记录系列 篇二:新年1月份(至春节前)行情历史梳理 过往记录系列 篇三:春节行情历史梳理 市场整体走势 整体趋势:震荡分化,先扬后抑 上涨概率约40%:…...
Jetson Nano 三个版本(B01 4GB、Orin 4GB、Orin 8GB)本地部署Deepseek等大模型的测评
Jetson Nano三个版本(B01 GB、Orin 4GB、Orin 8GB)本地部署Deepseek等大模型的测评 一、为什么要在终端设备部署大模型?二、 Jetson Nano推理大模型时计算资源占用情况分析为什么测试Jetson Nano?三款Jetson Nano芯片简介 三、大模型推理实验…...
基于Netty实现高性能HTTP服务的架构解析
一、HTTP协议基础 1.1 HTTP协议概述 HTTP(HyperText Transfer Protocol)作为现代Web应用的基石,是基于TCP/IP的应用层协议,具有以下核心特性: 请求/响应模型:客户端发起请求,服务端返回响应无…...
mac calDAV 日历交互
安装Bakal docker https://sabre.io/dav/building-a-caldav-client/ 在Bakal服务器上注册账户 http://localhost:8080/admin/?/users/calendars/user/1/ 在日历端登录账户: Server: http://127.0.0.1:8080/dav.php Server Path: /dav.php/principals/lion No e…...
【面试问题】Java 接口与抽象类的区别
引言 在 Java 面向对象编程中,接口(Interface)和抽象类(Abstract Class)是两个重要的抽象工具。它们都能定义未实现的方法,但设计目标和使用场景截然不同。本文将通过语法、特性和实际案例,深入…...
centos【rockylinux】安装【supervisor】的注意事项【完整版】
重新加载 systemd 配置推荐使用pip的方式安装 pip install supervisor 第二步:添加supervisord.conf配置文件 [unix_http_server] file/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 会使用 ;chmod0700 ; socket 文件的…...
数据库监控:确保业务连续性和用户体验
在数字化时代,数据库作为企业的数据心脏,其重要性不言而喻。无论是交易系统、客户关系管理系统,还是数据分析平台,都离不开数据库的支撑。然而,数据库的运行状态和性能直接影响着企业的业务连续性和用户体验。因此&…...
Deflate和Gzip压缩在HTTP响应中的作用与实现
1. 引言 HTTP响应压缩是一种优化技术,用于减少传输的数据量,从而提高网页加载速度和带宽利用率。Deflate和Gzip是两种常用的压缩算法,广泛应用于HTTP协议中。 2. Deflate与Gzip概述 2.1 Deflate算法简介 Deflate是一种无损数据压缩算法,结合了LZ77算法和哈夫曼编码。它…...
PointVLA:将 3D 世界注入视觉-语言-动作模型
25年3月来自美的集团、上海大学和华东师大的论文“PointVLA: Injecting the 3D World into Vision-Language-Action Models”。 视觉-语言-动作 (VLA) 模型利用大规模 2D 视觉语言预训练,在机器人任务方面表现出色,但它们对 RGB 图像的依赖,…...
sql server数据迁移,springboot搭建开发环境遇到的问题及解决方案
最近搭建springboot项目开发环境,数据库连的是sql server,遇到许多问题在此记录一下。 1、sql server安装教程 参考:https://www.bilibili.com/opus/944736210624970769 2、sql server导出、导入数据库 参考:https://blog.csd…...
SpringBoot-MVC配置类与 Controller 的扫描
文章目录 前言一、自动配置类位置二、自动配置类解析2.1 WebMvcAutoConfiguration2.1.1 EnableWebMvcConfiguration 2.2 DispatcherServletAutoConfiguration 三、RequestMapping 的扫描过程3.1 RequestMappingHandlerMapping#afterPropertiesSet3.2 RequestMappingHandlerMapp…...
企业年度经营计划制定与管理方法论(124页PPT)(文末有下载方式)
资料解读:企业年度经营计划制定与管理方法论 详细资料请看本解读文章的最后内容。 在企业的发展进程中,年度经营计划的制定与管理至关重要,它犹如企业前行的导航图,指引着企业在复杂多变的市场环境中稳健发展。这份《企业年度经营…...
基于微信小程序的充电桩管理系统
一、开发背景 在开发充电汽车管理系统之前,深入的需求分析至关重要。我们要充分了解不同用户群体的需求,比如私家车主希望充电过程便捷、高效、安全,能够实时查看充电状态和费用明细;出租车、网约车司机则更注重充电速度和充电桩…...
算法模型从入门到起飞系列——递归(探索自我重复的奇妙之旅)
文章目录 前言一、递归本质1.1 递归的要素1.2 递归特点 二、递归&迭代2.1 递归&迭代比较2.2 递归&迭代如何实现相同功能2.2.1 递归实现2.2.2 迭代实现2.2.3 性能对比 三、优雅的递归理解3.1 阶乘计算分解3.2 [DFS](https://blog.csdn.net/qq_38315952/article/deta…...
YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析
目录 关于摔倒检测 摔倒检测核心逻辑 摔倒检测:联合多种逻辑判断 原理详细解释 1. 导入必要的库 2. 定义函数和关键点连接关系 3. 筛选有效关键点并计算边界框 4. 计算人体上下半身中心点和角度 5. 绘制关键点和连接线 6. 绘制角度标注和检测跌倒 7. 返回处理后的图…...
麒麟银河V10服务器RabbitMQ安装
安装步骤 rabbitMQ依赖于erlang的环境,所以需要先安装erlang,erlang跟rabbitMQ是有版本之间的关联关系的,根据对应的版本去安装下载,保证少出问题。 可以通过官网来查看RabbitMQ和erlang之间的版本对应关系 rabbitMQ和erlang之间…...
React Hooks主要解决什么
1、状态逻辑复用困难 在Hooks出现之前,React组件间的状态逻辑复用主要依赖高阶组件(HOC)和 render props。 Hooks 通过允许创建自定义Hook,使得状态逻辑的复用变得简单而直接 缺点 HOC 可能导致 props 命名冲突render props …...
extern和static的作用(有例子)
一、extern extern的作用 声明而非定义 extern告诉编译器某个变量或函数存在于其他地方(通常是另一个源文件),当前只是声明它,而不是定义它(分配内存)。定义只能在一个地方出现,而声明可以多次…...
基于C#的以太网通讯实现:TcpClient异步通讯详解
基于C#的以太网通讯实现:TcpClient异步通讯详解 在现代工业控制和物联网应用中,以太网通讯是一种常见的数据传输方式。本文将介绍如何使用C#实现基于TCP协议的以太网通讯,并通过异步编程提高通讯效率。我们将使用TcpClient类来实现客户端与服…...
【8】分块学习笔记
前言 分块是一种重要的高级数据结构思想,核心为大段维护,局部朴素。 顺带一提,由于个人技术水平,本篇博客的难度并没有标题所述的 8 8 8 级。分块还是很难的。 分块 分块,是“优雅的暴力”。 分块的基本思想是把数据分为若干…...
Deployment声明式更新与应用式更新对比
目录 1. 声明式更新 特点 相关命令 示例 2. 命令式更新 特点 相关命令 示例 3. 声明式更新 vs 命令式更新 4. 声明式更新的优势 5. 命令式更新的适用场景 6. 总结 在 Kubernetes 中,声明式更新和命令式更新是两种不同的资源管理方式。它们分别通过不同的…...
