当前位置: 首页 > news >正文

线程池详解

线程池

什么是线程池:线程池就是管理一系列线程的资源池。

当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。

为什么要用线程池 / 线程池的好处:
  • **降低资源消耗。**通过重复利用已创建的线程降低线程创建和销毁造成的消耗

  • **提高响应速度。**当任务到达时,任务可以不需要等到线程创建久能立即执行。

  • **提高线程的可管理性。**统一管理线程,避免系统创建大量同类线程而导致消耗完内存。

线程池的应用:

比如我们系统 Web 服务器用的 Tomcat,Tomcat 处理每一个请求都会从线程连接池里面用一个线程去处理,又比如说我们连接数据库会用对应连接池 Druid德鲁伊等

还有实际开发中的定时任务,该任务的链路执行时间和过程都非常长,就会用一个线程池将该定时任务的请求进行处理。这样做好处就是可以及时返回结果给调用方,能够提高系统的吞吐量

// 请求直接交给线程池来处理 
public void push(PushParam pushParam) {try {pushServiceThreadExecutor.submit(() -> {handler(pushParam);});} catch (Exception e) {logger.error("pushServiceThreadExecutor error, exception{}:", e);}
}
如何创建线程池
  • 通过 ThreadPoolExecutor 构造函数来创建(推荐)
  • 通过 Executor 框架的工具类 Executors 来创建

为什么不推荐使用内置线程池(通过 Executor 框架的工具类 Executors 来创建):通过 ThreadPoolExecutor 构造函数的方式,这样的处理方式让开发人员更加明确线程池的运行规则,规避资源耗尽的风险

线程池常见参数有哪些
ThreadPoolExecutor 3个最重要的参数
  • corePoolSize:任何队列未达到队列容量时,最大可以同时运行的线程数量

  • maxinumPoolSize:当任务队列存放的任务达到队列容量的时候的最大线程数量。任何队列中存放的任务达到队列容量的时候,会创建新的线程运行任务。否则根据拒绝策略处理新任务。

  • workQueue:任务队列:新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中

    keepAliveTime:线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了 keepAliveTime才会被回收销毁。非核心线程空闲后,保持存活的时间;设置为0,表示多余的空闲线程会被立即终止

    unit:keepAliveTime 参数的时间单位

    threadFactory:

    handler:饱和策略

线程池的饱和策略:
  • ThreadPoolExecutor.AbortPolity:抛出 RejectedExecutionException来拒绝新任务的处理
  • ThreadPoolExecutor.CallerRunsPolicy:
  • ThreadPoolExecutor.DiscardPolicy:
  • .DiscardPolicy:
  • .DiscardOldestPolicy:
如何处理这些参数 / 线程池大小怎么设置
CPU密集型任务(N + 1)

消耗CPU资源,将线程数设置为 N(CPU 核心数)+1,比 CPU 核心数多出来一个线程是为了防止线程阻塞、锁等原因导致的任务暂停带来的影响。一旦某个线程被阻塞,释放了 cpu 资源,多一个线程就可以充分利用 CPU 的空闲时间

IO密集型

系统会用大部分时间处理 I/O 操作,而线程等待 I/O 操作会被阻塞,释放CPU资源,这是就可以将 CPU 交出给其它线程使用。因此在 I/O 密集型任务应用中,可以多配置一些线程:

最佳线程数 = CPU核心数 * (1/CPU利用率) = CPU 核心数 * (1 + (I/O耗时 / CPU耗时))

线程池过小:当有大量请求需要处理,系统响应比较慢影响体验,甚至会出现在任务队列大量堆积导致OOM

线程池过大:大量线程同时争取 CPU 资源,这样会导致大量的上下文切换,增加线程执行时间,影响整体执行效率

CPU密集型、IO密集型

如果你的应用主要是利用cpu计算,也就是更多的是消耗cpu资源的话,那么就是cpu密集型,如果更多的是和IO相关的,比如接收一个前端请求--解析参数--查询数据库--返回给前端这样的,那么就是IO密集型的。

线程池处理任务的流程

图解线程池实现原理

  1. 如果当前运行的线程数小于核心线程数,那么就会新建一个线程来执行任务
  2. 如果当前运行的线程数等于或大于核心线程数,但是小于最大线程,那么就把该任务放入到任务队列里等待执行
  3. 如果向任务队列投放任务失败,但是当前运行的线程数是小于最大线程数的,就新建一个线程来执行任务
  4. 如果当前运行的线程数已经等同于最大线程数了,新建线程将会是当前运行的线程超出最大线程数,那么当前任务会被拒绝,饱和(拒绝)策略会调用RejectedExecutionHandler.rejectedExecution() 方法

Excetors 工具类提供了哪些线程池?有什么问题吗?

Excetors 工具类提供的常见线程池如下:

  • FixedThreadPool:固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务。
  • SingleThreadExecutor:只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。
  • CachedThreadPool:可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。
  • ScheduledThreadPool:给定的延迟后运行任务或者定期执行任务的线程池。

Excetors 工具类提供的常见线程池的弊端如下:

  • FixedThreadPoolSingleThreadExecutor:使用的是无界的 LinkedBlockingQueue,任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。
  • CachedThreadPool:使用的是同步队列 SynchronousQueue, 允许创建的线程数量为 Integer.MAX_VALUE ,如果任务数量过多且执行速度较慢,可能会创建大量的线程,从而导致 OOM。
  • ScheduledThreadPoolSingleThreadScheduledExecutor:使用的无界的延迟阻塞队列DelayedWorkQueue,任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。

相关文章:

线程池详解

线程池 什么是线程池:线程池就是管理一系列线程的资源池。 当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。 为什么要用线程池 / 线程池的好处: **降低资源消…...

mybatis(5)参数处理+语句查询

参数处理&#xff0b;语句查询 1、简单单个参数2、Map参数3、实体类参数4、多参数5、Param注解6、语句查询6.1 返回一个实体类对象6.2 返回多个实体类对象 List<>6.3 返回一个Map对象6.4 返回多个Map对象 List<Map>6.5 返回一个大Map6.6 结果映射6.6.1 使用resultM…...

数据应用OneID:ID-Mapping Spark GraphX实现

前言 说明 以用户实体为例&#xff0c;ID 类型包含 user_id 和 device_id。当然还有其他类型id。不同id可以获取到的阶段、生命周期均不相同。 device_id 生命周期通常指的是一个设备从首次被识别到不再活跃的整个时间段。 user_id是用户登录之后系统分配的唯一标识&#xff…...

第6章 6.2.3 : readlines和writelines函数 (MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 在MATLAB的文本数据处理任务中&#xff0c;导入和导出文件是常…...

Matlab应用层生成简述

基础软件层 目前接触到的几款控制器&#xff0c;其厂商并没有提供simulink的基础软件库一般为底层文件被封装为lib&#xff0c;留有供调用API接口虽然能根据API接口开发基础软件库&#xff0c;但耗费时间过长得不偿失 应用层 所以可以将应用层封装为一个子系统&#xff0c;其…...

每日一题(leetcode1702):修改后的最大二进制字符串--思维

找到第一个0之后&#xff0c;对于后面的子串&#xff08;包括那个0&#xff09;&#xff0c;所有的0都能调上来&#xff0c;然后一一转化为10&#xff0c;因此从找到的第一个0的位置开始&#xff0c;接下来是&#xff08;后半部分子串0的个数-1&#xff09;个1&#xff0c;然后…...

PHP自助建站系统,小白也能自己搭建网站

无需懂代码&#xff0c;用 自助建站 做企业官网就像做PPT一样简单&#xff0c;您可以亲自操刀做想要的效果&#xff01; 自助建站是一款简单、快捷、高效的工具&#xff0c;可以帮助您制作响应式网站。我们的自助建站系统&#xff0c;将传统的编码工作转化为直观的拖拽操作和文…...

计算机视觉 | 基于 ORB 特征检测器和描述符的全景图像拼接算法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目实现了基于 ORB 特征检测器和描述符的全景图像拼接算法&#xff0c;能够将两张部分重叠的图像拼接成一张无缝连接的全景图像。 文章目录 一、随机抽样一致算法二、功能实现三、代码解析四、效果展示五、完整代码 一、随机…...

Scala - 函数柯里化(Currying)

柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。 实例 首先我们定义一个函数: def add(x:Int,y:Int)xy 那么我们应用的时候&#xff0c;应该是这样用&#xff1a;add(1,2) 现在我们把这…...

Switch-case

Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等&#xff0c;每个值称为一个分支。 语法 switch case 语句语法格式如下&#xff1a; switch(expression){case value ://语句break; //可选case value ://语句break; //可选//你可以有任意数量…...

蓝桥杯-单片机基础16——利用定时计数中断进行动态数码管的多窗口显示

综合查阅了网络上目前能找到的所有关于此技能的代码&#xff0c;最终找到了下述方式比较可靠&#xff0c;且可以自定义任意显示的数值。 传统采用延时函数的方式实现动态数码管扫描&#xff0c;在题目变复杂时效果总是会不佳&#xff0c;因此在省赛中有必要尝试采用定时计数器中…...

2024/4/5—力扣—下一个排列

代码实现&#xff1a; 思路&#xff1a;两遍扫描 void swap(int *a, int *b) {int t *a;*a *b;*b t; }void reverse(int *nums, int l, int r) {while (l < r) {swap(nums l, nums r);l;r--;} }void nextPermutation(int *nums, int numsSize) {int i numsSize - 2;wh…...

xss.pwnfunction-Ugandan Knuckles

这个是把<>过滤掉了所以只能用js的事件 ?weya"onfocus"alert(1337)" autofocus"...

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量 在电气化铁路运输中&#xff0c;受电弓滑板的健康状况对于保障列车安全行驶至关重要。受电弓滑板作为连接电网与列车的直接介质&#xff0c;其磨损情况直接影响到电能的有效传输及列车的稳定运行。精确、快速测量受电弓滑板磨损情…...

Linux第87步_阻塞IO实验

阻塞IO是“应用程序”对“驱动设备”进行操作&#xff0c;若不能获取到设备资源&#xff0c;则阻塞IO应用程序的线程会被“挂起”&#xff0c;直到获取到设备资源为止。 “挂起”就是让线程进入休眠&#xff0c;将CPU的资源让出来。线程进入休眠后&#xff0c;当设备文件可以操…...

C/C++基础----常量和基本数据类型

HelloWorld #include <iostream>using namespace std;int main() {// 打印cout << "Hello,World!" << endl;return 0; }c/c文件和关系 c和c是包含关系&#xff0c;c相当于是c的plus版本c的编译器也可以编译c语言c文件.cpp结尾.h为头文件.c为c语言…...

什么是生成式AI?有哪些特征类型

生成式AI是人类一种人工智能技术&#xff0c;可以生成各种类型的内容&#xff0c;包括文本、图像、音频和合成数据。那么什么是人工智能&#xff1f;人工智能和机器学习之间的区别是什么&#xff1f;有哪些技术特征&#xff1f; 人工智能是一门学科&#xff0c;是计算机科学的一…...

《Linux C/C++服务器开发实践》之第7章 服务器模型设计

《Linux C/C服务器开发实践》之第7章 服务器模型设计 7.1 I/O模型7.1.1 基本概念7.1.2 同步和异步7.1.3 阻塞和非阻塞7.1.4 同步与异步和阻塞与非阻塞的关系7.1.5 采用socket I/O模型的原因7.1.6&#xff08;同步&#xff09;阻塞I/O模型7.1.7&#xff08;同步&#xff09;非阻…...

SSH穿透ECS访问内网RDS数据库

处于安全考虑&#xff0c;RDS一般只会允许指定的IP进行访问&#xff0c;而我们开发环境的IP往往是动态的&#xff0c;每次IP变动都需要去修改RDS的白名单&#xff0c;为我们的工作带来很大的不便。 那么如何去解决这个问题&#xff1f; 假如我们有一台ESC服务器&#xff0c;E…...

python 有哪些函数

Python内置的函数及其用法。为了方便记忆&#xff0c;已经有很多开发者将这些内置函数进行了如下分类&#xff1a; 数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行(4个) 装饰器(3个) …...

3大场景×5项优化:ComfyUI视频合成VHS_VideoCombine节点全场景应用指南

3大场景5项优化&#xff1a;ComfyUI视频合成VHS_VideoCombine节点全场景应用指南 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 一、基础认知&#xff1a;视频合…...

ncmdump:一键解锁网易云音乐NCM加密文件,实现无损格式转换

ncmdump&#xff1a;一键解锁网易云音乐NCM加密文件&#xff0c;实现无损格式转换 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 你是否曾从网易云音乐下载了喜爱的歌曲&#xff0c;却发现只能在特定应…...

C语言开发者视角:Kandinsky-5.0-I2V-Lite-5s高性能推理引擎调用

C语言开发者视角&#xff1a;Kandinsky-5.0-I2V-Lite-5s高性能推理引擎调用 1. 引言&#xff1a;当静态告警遇上动态生成 想象一下这样的场景&#xff1a;工业监控系统捕捉到设备异常&#xff0c;触发静态告警图片。传统方案中&#xff0c;这张图片需要人工介入分析&#xff…...

Postman实战指南:深入解析CORS预检请求与响应头配置

1. 为什么CORS会成为开发者的噩梦&#xff1f; 第一次遇到CORS问题时&#xff0c;我盯着浏览器控制台那个鲜红的报错信息整整发呆了十分钟。"Access-Control-Allow-Origin"这个看起来人畜无害的响应头&#xff0c;竟然能让整个前端应用瘫痪。后来才发现&#xff0c;这…...

企业级OA系统高可用方案:泛微ecology+Nginx负载均衡最佳实践

企业级OA系统高可用架构设计与实践&#xff1a;泛微ecologyNginxResin全栈解决方案 在数字化转型浪潮中&#xff0c;办公自动化系统(OA)已成为企业核心IT基础设施。作为国内领先的协同管理平台&#xff0c;泛微ecology承载着企业关键业务流程&#xff0c;其稳定性直接影响组织运…...

dockerc故障排除终极指南:10个常见错误和解决方案清单

dockerc故障排除终极指南&#xff1a;10个常见错误和解决方案清单 【免费下载链接】dockerc container image to single executable compiler 项目地址: https://gitcode.com/gh_mirrors/do/dockerc dockerc作为一款container image to single executable compiler工具&…...

墨语灵犀对比传统方法:自动化作业批改效果实测

墨语灵犀对比传统方法&#xff1a;自动化作业批改效果实测 作为一名在教育技术领域摸爬滚打了多年的从业者&#xff0c;我见过太多关于“AI批改作业”的讨论。从最初的简单关键词匹配&#xff0c;到后来的规则引擎&#xff0c;每次技术迭代都让人充满期待&#xff0c;但实际落…...

Alpamayo-R1-10B参数详解:Top-p=0.98与Temperature=0.6组合的工程意义解析

Alpamayo-R1-10B参数详解&#xff1a;Top-p0.98与Temperature0.6组合的工程意义解析 1. 项目背景与技术架构 1.1 Alpamayo-R1-10B核心定位 Alpamayo-R1-10B是NVIDIA开发的自动驾驶专用视觉-语言-动作(VLA)模型&#xff0c;其核心设计目标是通过类人因果推理能力提升自动驾驶…...

如何高效管理LiteDB数据库?LiteDB.Studio实战指南与深度解析

如何高效管理LiteDB数据库&#xff1f;LiteDB.Studio实战指南与深度解析 【免费下载链接】LiteDB.Studio A GUI tool for viewing and editing documents for LiteDB v5 项目地址: https://gitcode.com/gh_mirrors/li/LiteDB.Studio 在现代软件开发中&#xff0c;嵌入式…...

HoRain云--Vue3组件开发:从入门到精通的终极指南

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...