线程池详解、核心参数、拒绝策略

news2024/11/27 4:27:20

什么是线程池

线程池是一种池化技术,它预先创建一组线程,用于执行异步任务。当有新任务到来时,线程池可以立即分配一个线程来处理,而不需要临时创建。这样可以减少因为频繁创建和销毁线程而导致的开销。

线程池的应用场景

  • 高并发服务器:如Web服务器、数据库服务器等,需要处理大量短生命周期的任务。
  • 定时任务执行:如定时清理缓存、定期检查系统健康等。
  • 异步任务处理:如文件上传下载、网络请求等IO密集型操作。

使用线程池的优势

  • 降低资源消耗:线程池通过重用已创建的线程,减少了创建和销毁线程的资源消耗。
  • 提高响应速度:由于线程已经预先创建好,任务到达时可以立即执行,无需等待线程创建,从而提高了系统的响应速度。
  • 提高线程的可管理性:线程池提供了对线程数量和任务数量的管理能力,使得系统更加稳定和可控。
  • 控制并发度:线程池可以有效地控制系统的并发度,防止因线程数量过多而导致系统资源耗尽。

线程池缺点

  • 增加复杂性:线程池的使用增加了系统的复杂性,需要合理配置和管理才能发挥其优势。
  • 可能导致资源不足:如果线程池的大小固定且任务量激增,可能会导致线程池中的线程不足以处理所有任务,从而影响性能。
  • 调优难度:正确的线程池大小取决于许多因素,如任务的性质、系统负载等,错误的配置可能导致性能问题。

核心参数

线程池的七大参数包括核心线程数、最大线程数、空闲线程存活时间、时间单位、任务队列、线程工厂和拒绝策略。具体如下:

  1. 核心线程数(corePoolSize):这是线程池启动时创建的线程数量,也是线程池中最小的线程数量。即使这些线程处于空闲状态,线程池也会保持它们的存活,不会被销毁。
  2. 最大线程数(maximumPoolSize):这是线程池中允许存在的最大线程数量。当任务数量超过核心线程数时,线程池会逐步增加线程数量,直到达到这个上限。
  3. 空闲线程存活时间(keepAliveTime):当线程池中的线程数量大于核心线程数且线程处于空闲状态,那么在指定时间后,这个空闲线程将会被销毁,从而逐渐恢复到稳定的核心线程数数量。
  4. 时间单位(unit):与空闲线程存活时间一起使用,用于指定时间的单位,如秒、分钟等。
  5. 任务队列(workQueue):用于存放待执行的任务的队列,有不同的实现,如ArrayBlockingQueue、LinkedBlockingQueue等。
  6. 线程工厂(threadFactory):用于创建新线程的工厂类,可以自定义线程的创建方式,如设置线程名称、是否为后台线程等。
  7. 拒绝策略(handler):当任务队列已满且无法创建新线程时,线程池会采取的策略,常见的有AbortPolicy(抛出异常)、CallerRunsPolicy(调用者运行)和DiscardOldestPolicy(丢弃最老任务)等。

(图源网络) 

线程池配置详见文章

CPU 密集型 和 IO密集型 的区别,如何确定线程池大小?-CSDN博客

四种常见的线程池详解文章

四种常见的线程池-CSDN博客

拒绝策略

线程池的拒绝策略主要有四种,分别是AbortPolicy、DiscardPolicy、DiscardOldestPolicy和CallerRunsPolicy

当线程池中的任务队列已满,且线程数量达到最大线程数(maximumPoolSize)时,线程池无法接受新的任务,此时就会根据配置的拒绝策略来处理新提交的任务。具体如下:

  1. AbortPolicy(默认策略):丢弃任务并抛出RejectedExecutionException异常。这种策略会立即提醒调用者任务被拒绝,通常用于需要快速响应的场景。
  2. DiscardPolicy:静默丢弃任务,不抛出异常。适用于那些不重要或是可重复提交的任务。
  3. DiscardOldestPolicy:丢弃队列中最老的那个任务,然后尝试重新提交当前被拒绝的任务。这种策略不会抛弃当前提交的任务。
  4. CallerRunsPolicy:由提交任务的线程自己执行该任务。这种策略适用于执行器已经饱和,但提交的任务具有高优先级或需要即时执行的情况。

在实际应用中,选择合适的拒绝策略取决于具体场景和业务需求。例如,如果任务丢失会导致严重后果,那么使用AbortPolicy可能更为合适,因为它会明确告知任务无法执行。相反,如果任务不那么关键,DiscardPolicy可能是一个不错的选择,因为它可以避免程序因异常而中断。

此外,了解线程池的核心参数如核心线程数(corePoolSize)、阻塞队列(workQueue)和最大线程数(maximumPoolSize)对于合理配置线程池和选择拒绝策略也是非常重要的。通过这些参数的合理设置,可以在一定程度上避免触发拒绝策略,例如增加队列容量或者调整线程池大小。

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

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

相关文章

【Go】五、流程控制

文章目录 1、if2、switch3、for4、for range5、break6、continue7、goto8、return 1、if 条件表达式左右的()是建议省略的if后面一定要有空格&#xff0c;和条件表达式分隔开来{ }一定不能省略if后面可以并列的加入变量的定义 if count : 20;count < 30 {fmt.Println(&quo…

前后端分离Springboot 整合使用activiti7教程(一)(全网最细)

activiti7关于SpringBoot前后端分离项目的详细教程 文章目录 activiti7关于SpringBoot前后端分离项目的详细教程一、Activiti工作流概述1.1 什么是工作流1.2 工作流应用场景1.3 什么是Activiti1.4 Activiti开发流程1.5 BPMN 2.0规范是什么1.6 BPMN 2.0 基本流程符号 二、Activi…

Java 实现扫描/识别图片文字 (OCR识别)

图片内容一般无法编辑&#xff0c;如果想要读取图片中的文本&#xff0c;我们需要用到OCR工具。本文将介绍如何在Java中实现OCR识别读取图片中的文字。 所需工具&#xff1a; IDEASpire.OCR for Java - Java OCR组件&#xff0c;支持识别多种语言、字体&#xff0c;可读取JPG、…

2024年大广赛联通沃派命题解析:赛题内容一览

2024大广赛又又又又又出新命题了&#xff0c;它就是助力青少年积极向上&#xff0c;乐观自信&#xff0c;探享多彩人生的5G时代潮牌——联通沃派&#xff0c;让我们来看看命题详情吧&#xff01; 联联通沃派是中国联通面向青少年群体推出的客户品牌&#xff0c;契合目标群体特…

module ‘numpy‘ has no attribute ‘int‘

在 NumPy 中&#xff0c;如果遇到了错误提示 "module numpy has no attribute int"&#xff0c;这通常意味着正在尝试以错误的方式使用 NumPy 的整数类型。从 NumPy 1.20 版本开始&#xff0c;numpy.int 已经不再是一个有效的属性&#xff0c;因为 NumPy 不再推荐使用…

win11 环境配置 之 Jmeter(JDK17版本)

一、安装 JDK 1. 安装 jdk 截至当前最新时间&#xff1a; 2024.3.27 jdk最新的版本 是 官网下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/ 建议下载 jdk17 另存为到该电脑的 D 盘下&#xff0c;新建jdk文件夹 开始安装到 jdk 文件夹下 2. 配…

不小心将某个分支的本地代码推到另外一个远程分支上

不小心将某个分支的本地代码推到另外一个远程分支上&#xff0c;是不会产生效果的&#xff0c;若提示了“Everything up-to-date ”&#xff0c;说明没有内容被提交到了远程&#xff0c;某个分支的本地代码仍然在本地仓库。 若想将改动的代码提交到另外一个远程分支上&#xf…

送朋友的生日祝福静态页面代码!(小白也能轻松GET!)

Hey亲爱的小白们&#xff01;&#x1f44b; 知道你们想给朋友一个独特又有心的生日祝福&#xff0c;却苦于没有编程基础吗&#xff1f;别担心&#xff0c;来白嫖&#xff01;&#x1f381; &#x1f680;【生日祝福静态页面代码】来啦&#xff01;只需简单几步&#xff0c;就能…

java多线程——概述,创建方式及常用方法

前言&#xff1a; 学习到多线程了&#xff0c;整理下笔记&#xff0c;daydayup!!! 多线程 什么是线程 线程&#xff08;Thread&#xff09;是一个程序内部的一条执行流程。若程序只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 什么是多线程 多线程是指从软硬件上…

E5063A是德科技E5063A网络分析仪

181/2461/8938产品概述&#xff1a; Keysight E5063A 是一款低成本网络分析仪&#xff0c;可为测试天线、电缆、滤波器和 PCB 等简单无源元件提供优化的性能和功能。Keysight E5063A 为您的企业提供价格和性能之间的最佳平衡&#xff0c;以满足您的业务和技术要求。它利用行业…

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

Arduino通过Wire库读取AS5600编码器数据

Arduino通过Wire库读取AS5600编码器数据 ✨在实际测试中&#xff0c;测试AS5600除了使用径向磁铁之外&#xff0c;球型的或者正四方体的强磁铁&#xff0c;也是可以准确的测量角度。测试高度的话&#xff0c;从板子&#xff08;芯片引脚底部&#xff09;到磁铁底部15毫米内&…

【MATLAB源码-第22期】基于matlab的手动实现的(未调用内置函数)CRC循环码编码译码仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 循环码是线性分组码的一种&#xff0c;所以它具有线性分组码的一般特性&#xff0c;此外还具有循环性。循环码的编码和解码设备都不太复杂&#xff0c;且检(纠)错能力强。它不但可以检测随机的错误&#xff0c;还可以检错突发…

《论文阅读》PAGE:一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023

《论文阅读》PAGE&#xff1a;一个用于会话情绪原因蕴含基于位置感知的图模型 ICASSP 2023 前言 简介任务定义模型构架Utterances Encoding with EmotionPosition-aware GraphCausal Classifier实验结果 前言 亲身阅读感受分享&#xff0c;细节画图解释&#xff0c;再也不用担…

【论文精读】CAM:基于上下文增强和特征细化网络的微小目标检测

文章目录 &#x1f680;&#x1f680;&#x1f680;摘要一、1️⃣ Introduction---介绍二、2️⃣Related Work---相关工作2.1 &#x1f393; 基于深度学习的对象检测器2.2 ✨多尺度特征融合2.3 ⭐️数据增强 三、3️⃣提议的方法3.1 &#x1f393; 具有上下文增强和特征细化的特…

c++使用类的一些注意事项

前言&#xff1a; 本篇内容为前面的补充&#xff0c;介绍了我们使用类时需要注意些什么以及一些编译器的优化&#xff0c;可能有些理解不到位或者错误&#xff0c;请斧正。 目录 前言&#xff1a; 1.再谈构造函数 2.&#xff08;c98&#xff09;隐式类型转换中的编译器的优…

牛客NC31 第一个只出现一次的字符【simple map Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c 核心 Map参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*…

Linux IRC

目录 入侵框架检测 检测流程图 账号安全 查找账号中的危险信息 查看保存的历史命令 检测异常端口 入侵框架检测 1、系统安全检查&#xff08;进程、开放端口、连接、日志&#xff09; 这一块是目前个人该脚本所实现的功能 2、Rootkit 建议使用rootkit专杀工具来检查&#…

在 Linux 中通过 SSH 执行远程命令时,无法自动加载环境变量(已解决)

问题场景 目前我的环境变量都存储在 /etc/profile 文件中&#xff0c;当我通过远程 SSH 执行一些命令时&#xff0c;提示命令找不到&#xff0c;如下所示&#xff1a; 问题出现原因 这里找到了一张出自尚硅谷的图片&#xff0c;很好的解释了该问题&#xff1a; 这是由于 Linu…