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

什么是线程池

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

线程池的应用场景

  • 高并发服务器:如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服务器支持多少人同时在线…

什么是技术分析和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…

电商系列之取消订单

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

SOA-面向服务架构

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

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

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

GRE和MGRE综合实验

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

使用nvm管理nodejs版本

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

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

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

Android 自定义EditText

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

WebViz可视化

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

Gitea 的详细介绍

什么是 Gitea? Gitea 是一个开源、轻量级的自托管 Git 服务,它允许用户搭建类似于 GitHub 或 GitLab 的代码托管平台。由于采用 Go 语言开发,Gitea 具有高效的性能和跨平台特性,适合个人开发者或小团队使用。 Gitea 的特点 轻量…

蓝桥杯第十三届电子类单片机组程序设计

目录 前言 单片机资源数据包_2023 一、第十三届比赛省赛 1.比赛题目 2.赛题解读 二、部分功能实现 1.继电器的开启与关闭 2.长按切换显示状态功能的实现 3.对于温度传感器小数部分的处理 4.其他处理 1)关于数码管显示小数的处理 2)关于5s后继…

结构体类型,结构体变量的创建和初始化 以及结构中存在的内存对齐

一般结构体类型的声明 struct 结构体类型名 { member-list; //成员表列 }variable-list; //变量表列 例如描述⼀个学⽣: struct Stu { char name[20]; //名字 int age; //年龄 char sex[5]; //性别 }; //结构体变量的初始化 int main() { S…

牛客NC30 缺失的第一个正整数【simple map Java,Go,PHP】

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

Modelsim手动仿真实例

目录 1. 软件链接 2. 为什么要使用Modelsim 3. Modelsim仿真工程由几部分组成? 4. 上手实例 4.1. 新建文件夹 4.2. 指定目录 4.3. 新建工程 4.4. 新建设计文件(Design Files) 4.5. 新建测试平台文件(Testbench Files&…

企业数据被新型.rmallox勒索病毒加密,应该如何还原?

.rmallox勒索病毒为什么难以解密? .rmallox勒索病毒难以解密的主要原因在于其采用了高强度的加密算法,并且这些算法被有效地实施在了病毒程序中。具体来说,.rmallox勒索病毒使用了RSA和AES这两种非常成熟的加密算法。RSA是一种非对称加密算法…

3D汽车模型线上三维互动展示提供视觉盛宴

VR全景虚拟看车软件正在引领汽车展览行业迈向一个全新的时代,它不仅颠覆了传统展览的局限,还为参展者提供了前所未有的高效、便捷和互动体验。借助于尖端的vr虚拟现实技术、逼真的web3d开发、先进的云计算能力以及强大的大数据处理,这一在线展…

瑞吉外卖实战学习--6、通过try和catch进行异常处理

try和catch进行异常处理 效果图前言1、公共拦截器进行异常处理1.1、创建公共报错处理的方法1.2、@ControllerAdvice中设置要拦截的类1.3、@ExceptionHandler中写处理的异常类2、完善错误拦截器2.1、效果效果图 前言 当用户名重复数据库会报错,此时就需要捕获异常操作 1、公共…

Spring: 在SpringBoot项目中解决前端跨域问题

这里写目录标题 一、什么是跨域问题二、浏览器的同源策略三、SpringBoot项目中解决跨域问题的5种方式:使用CORS1、自定 web filter 实现跨域(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、 CorsFilter(全局跨域)4、使用CrossOrigin注解 (局部跨域) 一、什么是跨域…