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

什么是线程池

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

线程池的应用场景

  • 高并发服务器:如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.mzph.cn/news/782025.shtml

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

相关文章

2024年腾讯云4核8G12M轻量应用服务器测评_CPU内存带宽系统盘

腾讯云4核8G服务器价格:轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线?支持30个并发数,可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

laravel(源码笔记) request-response 执行过程

request capture SymfonyRequest::createFromGlobals() createRequestFromFactory如果是form提交的方式,则创建Symfony Package里提供的 ParameterBag对象包,处理请求。 createFromBase duplicate 克隆请求,并重设一些属性 response run…

什么是技术分析和EA技术?澳福一个提醒丰厚收益

技术分析是指根据炒外汇市场汇率走势的过去表现,借助技术分析工具预测汇率的未来趋势并确定入市、出市策略的预测分析方法。 它是以预测市场价格变化的未来趋势为目的,以市场行为(外汇市场的价格和交易量)的图形、图表、形态、指标为手段,使用…

docker通过已有镜像打包执行

1、查看已有镜像 docker images 2、制作dockerfile FROM python LABEL maintainer"JETZ" add . / WORKDIR /3、新建镜像 docker build -t python3.7.13 .4、打包导出镜像 docker save python3.7.13 -o /opt/python3.7.13.tar5、重新加载镜像 cd /opt docker l…

花钱的艺术:消费和投资如何分配

消费是钱花出去就回不来了。 消费分为可选消费和必需消费。 必需消费是必须花的钱,用一句老话,财米油盐酱醋茶,维持生活必需的支出。 可选消费,用来提升生活水平的支出,可花可不花,比如苹果手机&#xf…

电商系列之取消订单

> 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家…

SOA-面向服务架构

SOA-面向服务架构 1.概述2.SOA的设计原则包括:3. SOA实现方法1.Web Service2. 服务注册表3. 企业服务总线 细讲 超赞笔记 1.概述 SOA (Service-Oriented Architecture,SOA),从应用和原理的角度,目前有2种…

GET 与 POST(计算机网络)

GET :从服务器获取指定的资源。 POST :根据请求负荷(报文body)对指定的资源做出处理。 GET 和 POST 方法都是安全和幂等的吗? 在 HTTP 协议里安全和幂等的概念: 「安全」:请求方法不会「破坏」…

Matlab之提高交叉定位点的定位精度

通过测向交叉定位的方法,按理只需2根测向线即可得出定位点的位置。但由于误差的存在,求出的定位点位置存在一定的偏差。为了得到更加精确的定位点位置,需要对定位点进行冗余测量,从而得到多个定位点,然后通过定位点估计…

redis分布式锁-----基于Redis的SETNX命令的简单分布式锁实现

Redis的SETNX命令的简单分布式锁实现的Java示例 首先&#xff0c;确保你已经引入了Jedis这个Java Redis客户端库。你可以通过Maven或Gradle来添加依赖。 1、Maven依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifact…

Docker一键部署MySQL 8

Docker一键部署MySQL 8 脚本下载 下载路径&#xff1a;mysql8.0.20.sh 使用FTP 工具或rz 命令将脚本上传到服务器 授权 [rootxxx~]# chmod x mysql8.0.20.sh执行脚本 [rootiZm5e4qautzfi19sq8s7aeZ ~]# ./mysql8.0.20.sh 初始化MySQL部署... 拉取MySQL 8.0.20 镜像... 8.…

(一)认识微服务

1. 什么是微服务 微服务是分布式架构的一种。 1.1 微服务技术 &#xff01; Spring Cloud 分布式架构就是要把服务进行拆分&#xff0c;拆分的过程会产生一系列问题需要解决&#xff0c;而Spirng Cloud 只是解决了服务拆分的过程中的服务治理问题&#xff0c;所以一个完整的…

GRE和MGRE综合实验

实验拓扑图 实验思路 根据图中所属网段&#xff0c;配置ip地址和网关R1,R2,R3,R4配置缺省路由&#xff0c;可以是公网互通使用ppp验证&#xff0c;R1与R5为PAP验证&#xff0c;R5:aaa地址池&#xff0c;创建用户名以及密码&#xff0c;同时进行pap服务认证&#xff0c;同时在…

playwright 对象是 Playwright 框架中的核心对象

Playwright对象是Playwright框架中的一个重要对象&#xff0c;它充当了管理和控制浏览器实例的中介&#xff0c;并提供了访问不同浏览器引擎功能的接口。Playwright库为Web浏览器自动化提供了一组强大的API&#xff0c;可以轻松地操作和控制Chromium、Firefox和WebKit浏览器。p…

(root用户与非root用户)linux下安装最新版tmux

下载依赖包 tmux需要两个依赖包&#xff0c;libevent和ncurses&#xff0c;在tmux的github wiki官网可以找到对应的源码下载地址: libeventncursestmux 下载三个包的tar.gz文件 root用户与非root用户 下列安装指令中&#xff0c;如果是root用户想安装到系统级目录下&#x…

使用nvm管理nodejs版本

文章目录 1、下载NVM2、选择NVM安装3 、查询版本号&常用命令4、nvm命令安装指定版本node4.1 安装指定node4.2 查看是否安装成功4.3 切换node版本到你想要的版本4.4 再次查看nvm版本列表4.5 nvm其他常用命令 这个是每个全能前端经常会用到的&#xff0c;之前用过现在重装了&…

如何Hook [NSString stringWithFormat] 代码hook stringWithFormat中替换NSString字符串

怎么hook stringWithFormat方法 id stringWithFormat(id self, SEL op,id obj1, ...); id stringWithFormat(id self, SEL op,id obj1, ...){va_list args;va_start(args, obj1);//等价实现方法NSString *result [[NSMutableString alloc] initWithFormat:obj1 arguments:arg…

BitVM2:比特币上的无需许可验证

1. 引言 前序博客有&#xff1a; 基于BitVM的乐观 BTC bridgeBitVM&#xff1a;Bitcoin的链下合约Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f; 最初的 BitVM 设计仅限于两方设置。BitVM2结合了并行和冗余实例&#xff0c;以引入基于 1-of-n 诚实假设的多方配置。这…

Android 自定义EditText

文章目录 Android 自定义EditText概述源码可清空内容的EditText可显示密码的EditText 使用源码下载 Android 自定义EditText 概述 定义一款可清空内容的 ClearEditText 和可显示密码的 PasswordEditText&#xff0c;支持修改提示图标和大小、背景图片等。 源码 基类&#xf…

WebViz可视化

WebViz可视化 Webviz是一个基于Web的可视化工具&#xff0c;意味着您可以通过浏览器/APP访问它&#xff0c;而不需要安装额外的软件。这对于远程访问和团队协作非常方便。 Foxglove是一个开源的工具包&#xff0c;包括线上和线下版。旨在简化机器人系统的开发和调试。它提供了…