不是吧?线程池这样搞?

其他系列文章目录

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

系列文章目录

前言

一、为什么需要线程池?

二、举个背景例子

三、怎么创建线程池?

四、线程池指定线程数


前言

学习线程池能够帮助我们更好地处理多线程编程,并提高程序的性能和稳定性


一、为什么需要线程池?

JVM在HotSpot的线程模型下,Java线程会一对一映射为内核线程。
这意味着,在Java中每次创建以及回收线程都会去内核创建以及回收。
这就有可能导致: 创建和销毁线程所花费的时间和资源可能比处理的任务花费的时间和资源要更多。
线程池的出现是为了提高线程的复用性以及固定线程的数量!!!


二、举个背景例子

一个消息管理平台,提供其中一个功能就是: 运营会圈定人群然后群发消息。
主要流程大致就是:创建模板---->定时---->群发消息---->用户收到消息

先说一个概念:HDFS (Hadoop Distributed File System) 是分布式文件系统的一种,用于存储和处理大数据集。它是Hadoop框架的核心组件之一。HDFS可以让用户将大数据集分散在多台计算机上,以提高数据处理能力和可靠性。它将数据拆分为小块并存储在多台计算机上,提供了读写分离、容错机制、数据备份和高可用等特性。HDFS的基本单位是数据块,通常为128MB或256MB。数据块的复制数量和位置由系统自动管理。HDFS对于大数据的存储和管理提供了高度的可靠性和可扩展性,因此被广泛应用于大数据处理和分析领域。

然后运营圈定的人群实际上在模板上只是一个ID、这边要通过ID去获取到HDFS文件,
对HDFS文件进行遍历,然后继续往下发,(接收到定时任务,再对HDFS进行遍历)这里的处理,用的就是线程池处理。

HDFS遍历其实就是IO的操作,把这个过程给异步化,为了提高系统的吞吐量,于是这里用的线程池。即便遍历HDFS出现问题,我们可以建设完备的监控和告警可以及时发现。


三、怎么创建线程池?

阿里巴巴开发手册就有提到,不要使用Executors去创建线程。建议使用ThreadPoolExecutor去创建线程池。

最主要的目的就是:使用ThreadPoolExecutor创建的线程你是更能了解线程池运行的规则,避免资源耗尽的风险。

七个核心参数:

  1. corePoolSize:核心线程数,线程池维护的最少线程数。

  2. maximumPoolSize:最大线程数,线程池维护的最大线程数。

  3. keepAliveTime:线程空闲时间,当线程池中的线程数大于核心线程数时,这些多余的线程会被销毁,这个参数定义了这些线程的空闲时间。

  4. TimeUnit:时间单位,keepAliveTime的时间单位。

  5. workQueue:任务队列,当提交的任务数量大于线程池当前可用的线程数时,任务会被存放在这个队列中。

  6. threadFactory:线程工厂,用于创建线程池中的线程。

  7. handler:拒绝策略,当任务队列已满且线程池中的线程数量已达到最大值时,新提交的任务如何被拒绝执行。常用的拒绝策略有AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy和DiscardPolicy。

任务提交流程:

  1. 首先会判断运行线程数是否小于coreFoolSize,如果小于,则直接创建新的线程执行任务。
  2. 如果大于corePoolSize,判断workQueue阻塞队列是否已满,如果还没满,则将任务放到阻塞队列中。
  3. 如果workQueue阻塞队列已经满了则判断当前线程数是否大于maximumPoolSize,如果没大于则创建新的线程执行任务。
  4. 如果大于maximumPoolSize,则执行任务拒绝策略 (具体就是你自己实现的handler)。

这里有个点需要注意下,就是workQueue阻塞队列满了,但当前线程数小于maximumPoolSize,这时候会创建新的线程执行任务。

不过一般我们都是将corePoolSize和maximumPoolSize设置相同数量。
keepAliveTime指的就是,当前运行的线程数大于核心线程数了,只要空闲时间达到了,就会对线程进行回收。


四、线程池指定线程数

线程池指定线程数这块,首先要考量自己的业务是什么样的??

是cpu密集型的还是io密集型的,假设运行应用的机器CPU核心数是N

cpu密集型的可以先给到N+1,io密集型的可以给到2N

上面这个只是一个常见的经验做法,具体究竟开多少线程,需要压测才能比较准确地定下来。

注:线程不是说越大越好,在之前的我也提到过,多线程是为了充分利用CPU的资源。如果设置的线程过多,线程大量有上下文切换,这一部分也会带来系统的开销,这就得不偿失了。


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

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

相关文章

TikTok美区本土店铺如何做好IP隔离?

为什么要进行IP隔离呢?因为我们无法在国内直接运营Shopee、TikTok、Lazada等平台的本土店,平台识别出店铺登录IP非本土IP,则容易导致店铺风控、被标记为伪本土店,影响店铺经营。 TikTok美区店铺的IP隔离方法和Shopee本土店一致&a…

SpringMVC(二)

八、HttpMessageConverter HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型:RequestBody,ResponseBody,Reque…

【MySQL】子查询

文章目录 子查询IN运算符子查询 VS 连接ALL关键字ANY关键字相关子查询 !EXISTS运算符select子句中的子查询from子句中的子查询 子查询 获取价格大于id为3的货物的商品 用到了内查询,获取id为3的商品的单价,把结构传给外查询 在where子句中编写子查询&am…

【python基础(四)】if语句详解

文章目录 一. 一个简单示例二. 条件测试1. 检查多个条件1.1. 使用and关联多个条件1.2. 使用or检查多个条件1.3. in的判断 2. 布尔表达式 三. if语句1. 简单的if语句2. if-else语句3. if-elif-else结构4. 使用多个elif代码块5. 省略else代码块 四. 使用if语句处理列表1. 检查特殊…

2023-11-23 LeetCode每日一题(HTML 实体解析器)

2023-11-23每日一题 一、题目编号 1410. HTML 实体解析器二、题目链接 点击跳转到题目位置 三、题目描述 「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们…

Endnote软件添加期刊引用格式

在下述网址中,找到你想要添加的期刊,下载引用格式文件(后缀为.ens格式) https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下载…

SQLY优化

insert优化 1.批量插入 手动事务提交 主键顺序插入,主键顺序插入性能高于乱序插入 2.大批量插入数据 如果一次性需要插入大批量数据,使用Insert语句插入性能较低,此时可以使用MYSQL数据库提供的load指令进行插入 主键优化 主键设计原则 …

Java实现王者荣耀小游戏

主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…

vue3 终端实现 (vue3+xterm+websocket)

目录 一、xterm介绍 二、效果展示 三、vue文件实现代码 一、xterm介绍 xterm是一个使用

【C++初阶】STL详解(七)Stack与Queue的模拟实现

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

力扣labuladong一刷day17天前缀和数组

力扣labuladong一刷day17天前缀和数组 一、303. 区域和检索 - 数组不可变 题目链接:https://leetcode.cn/problems/range-sum-query-immutable/ 思路:本题即为让写一个类用于计算指定区间内的数字和,但如果直接采用for循环的方式&#xff0…

Unity调用dll踩坑记

请用写一段代码,让unity无声无息的崩溃。 你说这怕是有点难哦,谁会这么不幸呢?不幸的是,我幸运的成为了那个不幸的人。 unity里面调用dll的方式是使用 DllImport ,比如有一个 Hello.dll,里面有一个 char* …

图片如何去除水印?试试这三种去水印方法!

从事自媒体行业的小伙伴们,你们是否经常为文章配图而烦恼呢?下载的图片大部分带有各种各样的水印或者多余元素,让人感到困扰。今天,我要分享三个去水印的妙招,这是新媒体人必备的图片处理技能,快来一起学起…

【MATLAB源码-第87期】基于matlab的Q-learning算法栅格地图路径规划,自主选择起始点和障碍物。

操作环境: MATLAB 2022a 1、算法描述 Q-learning是一种无模型的强化学习算法,适用于有限的马尔可夫决策过程(MDP)。它的核心是学习一个动作价值函数(action-value function),即Q函数&#xf…

面试官:【js多维数组扁平化去重并排序】

文章目录 前言方法一方法二方法三方法四总结后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:JavaScript 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&a…

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB在实战项目中替换Milvus测试

为什么尝试使用Tencent Cloud VectorDB替换Milvus向量库? 亮点:Tencent Cloud VectorDB支持Embedding,免去自己搭建模型的负担(搭建一个生产环境的模型实在耗费精力和体力)。 腾讯云向量数据库是什么? 腾…

rsync配置和守护进程实践

目录 一、rsync概念 1.rsync简介 2.rsync特点 3、增量和全局传输 二、Rsync工作方式 1.准备好rsync备份服务器 2.本地的数据传输模式 3.远程的数据传输模式 4.rsync数据推拉模式 三、实践 1.准备三台虚拟机 2.都安装rsync服务 3.拉取远程文件 3.推送文件 4.rsyn…

Oracle用户(User)和表空间(Tablespace)

3. 用户和表空间 3.1. 用户 1)概念 Oracle数据库中,用户(User)是访问数据库的途径和认证方式,同时,用户也是数据库对象的逻辑集合。我们通过数据库用户和密码来登录数据库,然后,可以在该用户下创建和操作数据库对象。 2)创建和配置 创建Oracle用户,需要具备创建…

python系统编程

文章目录 系统编程系统工具概述sys模块os模块 脚本运行上下文当前工作路径命令行参数shell环境变量标准流 文件和目录工具文件工具目录工具 并行系统工具进程分支线程 系统编程 系统工具 概述 python系统模块: 模块名作用*sys负责导出与怕以后呢解释器本身相关的组件*os包含…

Django DRF序列化器serializer

以下案例由浅到深&#xff0c;逐步深入&#xff0c;通过实例介绍了序列化器的使用方法&#xff0c;和其中遇到的常见问题的解决。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…