记java生产项目中线程池使用的一点总结

背景

最近项目中有很多使用线程池进行处理的地方,同时也碰到了几个问题比如线程池的个数该怎么评估,线程程的该怎么具体去使用,结合项目和实际场景得到一些理解

使用多线程的三种方式

设定多线程数量

通过指定核心和最大线程数大于1的方式来执行多个线程任务
适用场景:线程任务无需区分顺序,只需要有资源执行即可

new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MINUTES, queue, new ThreadFactoryBuilder().setNameFormat(threadKey).setUncaughtExceptionHandler((t, e) -> log.error("handler error: ", Thread.currentThread().getName(), e)).build(), new DiscardPolicy());

Map管理多个线程池方式

使用map管理多个线程池
适用场景:适合任务需要顺序执行的场景,通过任务的唯一键进行hash获取对应的线程池对象

  public static final Map<String, ExecutorService> map= new ConcurrentHashMap<>();public static void execute(String key, Runnable runnable) {String threadKey = key;ExecutorService service = map.get(threadKey);if (service == null) {service = init(threadKey);tsReciveThreadMap.put(threadKey, service);}service.execute(runnable);}

本地异步队列

启动独立的线程,使用LinkedBlockingQueue循环等待接收消息

适用场景:适合批量等待处理一批数据的场景,循环等待一定时间,批量存储数据

public Map<String, BlockingQueue> queue = new HashMap<>();public void init(ExecutorService executorService) {for (int i = 0; i < 5; i++) {LinkedBlockingQueue<T> blockingQueue = new LinkedBlockingQueue<>();String key = i;queue.put(key, blockingQueue);executorService.execute(() -> {while (true) {try {T take = blockingQueue.take();Map<String, T> data = new HashMap<>();data.put(take.getKey(), take);long current = System.currentTimeMillis();while (!blockingQueue.isEmpty() && data.size() < 100 && System.currentTimeMillis() - current < 1000) {T take1 = blockingQueue.poll();if (take1 != null) {data.put(take1.getKey(), take1);}}this.handleMessage(data);} catch (Exception e) {log.error("", e);}}});}}

线程参数配置

网上有一个比较广传的线程数设定公式

CPU 密集型的程序 - 核心数 + 1
I/O 密集型的程序 - 核心数 * 2

但是我们在设定线程数的时候,应该根据当前任务的具体逻辑来判断而不是使用网上这种通用公式。
以下有几个自己在项目中的实际体验
1.关注我们提交任务给线程池的流入速率
2.关注我们线程任务执行的流出速率
3.结合处理速率设定队列的大小

总结

上面列出了在实际项目中使用的3种线程池的方式,使用线程池要结合业务场景以及

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

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

相关文章

JY-156/1静态电压继电器 板前接线 约瑟JOSEF

JY-150系列电压继电器适用于继电保护线路中&#xff0c;作为过电压保护或低电压闭锁的动作元件。 该产品采用集成电路原理构成&#xff0c;它克服了原来电磁型电压继电器触点易抖动&#xff0c;工作时噪音大&#xff0c;动作值、返回值难调整及运输后动作值易变等缺点&#xff…

Dubbo 3.x源码(23)—Dubbo服务引用源码(6)MigrationRuleListener迁移规则监听器

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的服务引入的总体流程&#xff0c;以及Dubbo服务引用bean的获取以及懒加载原理。当然真正的服务远程引入、以及配置迁移啥的都还没讲&#xff0c;MigrationRuleListener#onRefer方…

什么洗地机好用又实惠?四大口碑优品推荐,超级火爆

作为一个家电工作者&#xff0c;近年来测评了不少洗地机&#xff0c;相对于传统的清洁习惯&#xff0c;即先扫地&#xff0c;再拖地&#xff0c;洗地机能够在一拖一拉之间&#xff0c;便完成地面上的清洁&#xff0c;而且人们也不用低头弯腰的去清洁&#xff0c;可谓是省时省力…

【单片机毕业设计选题24013】-基于STM32的城市垃圾分类引导系统

系统功能: 1、系统具有语音识别功能&#xff0c;可以对厨余垃圾、其他垃圾、有害垃圾、可回收垃圾进行语音识别&#xff1b; 2、系统可根据语音识别结果直接开启对应类别的垃圾桶&#xff0c;引导分类投放&#xff1b; 3、系统具有语音播报功能&#xff0c;可以语音播报出识…

使用 swiper 轮播 echarts 图表,地图点击失效

问题 使用 swiper 轮播 echarts 图表&#xff0c;地图点击失效&#xff0c;伪代码如下 <Swiper><SwiperSlide>...</SwiperSlide>// 轮播中有地图<SwiperSlide><EchartsMap/></SwiperSlide><SwiperSlide>...</SwiperSlide> &…

Java学习 - MySQL常用性能优化 + Explain查看执行计划

常用性能优化方式 服务器硬件优化&#xff1a;加机器&#xff0c;加内存MySQL服务器优化&#xff1a;更改参数&#xff0c;增加缓冲等等SQL本身优化&#xff1a;减少子查询&#xff0c;减少连接查询的使用反范式设计优化&#xff1a;为了减少连接查询使用&#xff0c;可以允许…

同三维TT806-1 USB单路网络视频流/U盘采集卡

同三维TT806-1 USB单路网络视频流/U盘采集卡 (1路网络音视频信号或U盘直播推流器) 支持采集1路网络视频流或U盘音视频信号&#xff0c;USB输出到电脑 同时还可流推2个直播平台&#xff0c;可设置6组定时推流&#xff0c;有线网络 可录像到U盘&#xff0c;支持定时录像 一…

05 部署YUM软件仓库

5.1部署YUM软件仓库 5.1.1准备网络安装源 YUM软件仓库通常借助于HTTP或FTP协议来发布&#xff0c;这样可以面向网络中的所有客户机提供软件源服务。 1.准备软件仓库目录 在Center 7 系统的安装光盘中&#xff0c;已针对软件目录Packages建立好repodata数据&#xff0c;因此…

input标签删除文件之后再次上传同一文件无法触发change

HTML<input type"file" accept".pdf" id"upload-btn" />jsdocument.getElementById(upload-btn).addEventListener(change, function (e) {const file e.target.files[0]; }); 修改&#xff1a; //删除文件document.querySelector(#demo…

Web前端仿项目:探索实践之路

Web前端仿项目&#xff1a;探索实践之路 在Web前端领域&#xff0c;仿项目是一种常见且有效的学习方式。通过模仿已有的项目&#xff0c;我们可以深入了解前端技术的实际应用&#xff0c;提升自己的实践能力。然而&#xff0c;如何有效地进行Web前端仿项目&#xff0c;却是一个…

【向量检索】之向量数据库Milvus,Faiss详解及应用案例

Reference https://www.modb.pro/db/509268 笔记︱几款多模态向量检索引擎&#xff1a;Faiss 、milvus、Proxima、vearch、Jina等 - 知乎 (zhihu.com) 向量数据库入坑指南&#xff1a;聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss - 苏洋的文章 - 知乎 常用的三种索引方…

shiny实现点击跳转下一个标签栏

在 Shiny 应用中实现点击按钮跳转到下一个标签栏&#xff0c;可以使用 shiny 的内置函数 updateTabsetPanel 来控制标签栏的切换。以下是一个简单的示例代码&#xff0c;演示了如何通过点击按钮来跳转到下一个标签栏&#xff1a; library(shiny)ui <- fluidPage(titlePanel…

fastapi修改docs文档页面favicon.ico图标

如下图&#xff0c;文档页面默认使用的是tiangolo大神的Logo 如果打开的标签比较多&#xff0c;就不好区分了&#xff0c;想要修改这个logo&#xff0c;可以用fastapi-cdn-host一行代码搞定 fastapi_cdn_host.patch_docs(app, favicon_url/static/logo.png) 例如&#xff1a;…

macbook pro 鼠标键 导致键盘失灵

问题 关闭鼠标键之后 所有键盘还是不可用&#xff08;开关机键除外&#xff09; 解决 开机按住commands进入单用户模式exit重启电脑

react-2 jsx的学习

1.什么是JSX&#xff1f; 概念&#xff1a;JSX就是Javascript和XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在js代码中编写HTML模板结构&#xff0c;它是React中编写UI模板的方式&#xff0c;如下图就是jsx: 优势&#xff1a;1.HTML的声明式模板写法&#xff1b;…

IDEA GIt 提交提示 “Contents are identica“

当前问题的描述 IDEA 中使用 Git 提交代码时候, 会发现出现在变动列表只用, 文件本身是蓝色的, 也代表文件有改变&#xff0c;但比较上一次的版本和本地版本是一致的, 显示 no difference 并且显示 Contents are identica, 即内容无改变, 但是文件还是蓝色的; 此时拉取代码, 如…

铠侠全面复产:NAND价格还会涨吗?

近期&#xff0c;日本经济新闻&#xff08;Nikkei&#xff09;报道指出&#xff0c;经历长达20个月的产能削减后&#xff0c;全球第四大三维NAND闪存制造商铠侠已全面恢复生产。这一转变不仅标志着铠侠再次全力投入到市场份额的争夺中&#xff0c;也可能预示着闪存市场价格即将…

MySQL-DML-约束

079-对表中数据进行增删改 DML语句 当我们对表中的数据进行增删改的时候,称它为DML语句。(数据操纵语言),主要包括:insert、delete、update insert 增 语法格式: insert into 表名(字段名1,字段名2,字段名3,...) values(值1,值2,值3,...);表名后面的小括号当中的字段…

网络流量轮廓

示例场景 假设你是一个公司网络管理员&#xff0c;负责维护和监控公司内部网络的安全和性能。你的任务是确保网络流量正常&#xff0c;没有异常行为&#xff0c;同时优化网络资源分配。 数据采集 你使用网络流量监控工具&#xff08;如Wireshark、NetFlow等&#xff09;来收…

Unity URP下通过相机让部分Render不受后处理渲染

我们有时候不想某些对象受到后处理影响&#xff0c;找到了这样一个决绝办法&#xff0c;通过增加一个Overlay相机只照射这个模型来实现&#xff0c;下面看看如何实现。 第一步 首先我们拖一个测试场景&#xff0c;有如下一些元素 一个盒子&#xff0c;以后后处理&#xff0c…