ThreadPoolExecutor执行流程和拒绝策略

news2025/1/12 0:49:18

【面试常考】

之前我们讲到的多线程案例里面的Executors 本质上是 ThreadPoolExecutor 类的封装.

ThreadPoolExecutor 提供了更多的可选参数, 可以进一步细化线程池行为的设定.

什么是ThreadPoolExcutor类?

首先通过文档我们看看ThreadPoolExcutor提供给我们的构造方法

image-20230226121256945

它提供了很多种构造方法,可以支持很多参数,支持很多选项,让我们创建出不同风格的线程池。

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 

我们重点关注这个构造方法解释一下参数的含义:

  • corePoolSize:核心线程数 (类似于正式员工)
  • maximumPoolSize 最大线程数 (类似于正式员工+实习员工)

需要注意的是:核心线程数即使线程空闲也不会被销毁,但是最大线程数中除去核心线程数部分如果空闲太长时间则会被销毁,防止占用系统资源

  • keepAliveTime 允许“实习员工”(最大线程数 中除去核心线程数)空闲的最大时间
  • unit时间的单位
  • workQueue 任务队列 【使用者不传入,线程池就会自己内部创建一个】
  • threadFactory 描述线程是如何创建的 【上个文章提到的工厂对象,程序员可以手动指定线程的创建策略】
  • RejectedExecutionHandler handler 拒绝策略 【实现“高并发’服务器非常有意义】

【面试考频:☆☆☆☆☆】线程池的拒绝策略

什么是拒绝策略?

线程池的拒绝策略~线程池的任务队列已经满(工作线程已经忙不过来了)又有别人往里添加新的任务线程池应对方法。

标准库里提供的拒绝策略:

image-20230226123342646

中止策略ThreadPoolExecutor.AbortPolicy

【丢弃任务并抛出RejectedExecutionException异常。】

不处理新添加的任务,并且当前正在处理的所有任务全部中断;

线程池默认的拒绝策略,在任务不能再提交的时候,抛出异常,及时反馈程序运行状态

ThreadPoolExecutor.CallerRunsPolicy

【由调用线程处理该任务】

提交的任务被拒绝了,则由调用线程(提交任务的线程)直接执行此任务

忽略最先加入队列的任务ThreadPoolExecutor.DiscardOldestPolicy

【丢弃队列最前面的任务,然后重新提交被拒绝的任务】

是一种喜新厌旧的拒绝策略。是否要采用此种拒绝策略,还得根据实际业务是否允许丢弃老任务来认真衡量。

忽略此任务 ThreadPoolExecutor.DiscardPolicy

【丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃】

使用此策略,可能会使我们无法发现系统的异常状态。

线程池执行流程

image-20230226130000226

文字版:

  1. 当新加入一个任务时,先判断当前线程数是否大于核心线程数,如果不大于,则新建线程并执行任务;
  2. 如果大于,则判断任务队列是否已满,如果没满,则把任务添加到任务队列中等待线程执行
  3. 如果任务队列满了,则判断当前线程数量是否超过最大线程数?如果不超过,则新建线程执行此任务
  4. 如果结超过了,执行拒绝策略。

【面试问题2】线程池的线程数目如何确定?

线程池不是可以自定义线程数目,那么在实际开发中,线程池的线程数目, 如何确定? 设定成几比较合适?

考察点:是如何设置线程池数目的方法(实验+压测)

实验验证法:

针对程序进行性能测试,分别给线程池设置成不同的数目。 N 1.5N 2N 0.5N都测试;

分别记录每种情况下程序的核心性能指标和系统负载情况,再进行选择。


回顾练习:

使用ThreadPoolExecutor创建一个忽略最新任务的线程池,创建规则:

1.核心线程数为5

2.最大线程数为10

3.任务队列为100

4.拒绝策略为忽略最新任务

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

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

相关文章

超详细彻底卸载Anaconda详细教程

一、在开始出打开Anaconda Prompt 二、打开后&#xff0c;输入conda install tqdm -f命令并按回车键 conda install tqdm -f三、之后页面会出现一个WANNING&#xff0c;这个我们不用在意&#xff0c;之后会出现一个y/n提示框&#xff0c;在这里我们输入y或者Y y四、输入con…

小程序容器与微服务架构的关系

随着移动互联网的发展&#xff0c;小程序已经成为了一种非常流行的应用方式&#xff0c;它可以在不安装任何应用的情况下&#xff0c;直接在移动终端设备&#xff08;如&#xff1a;App&#xff0c;iPad等&#xff09;中运行。微服务架构则是一种的分布式系统架构&#xff0c;可…

SpringBoot整合MybatisPlus多数据源

相信在很多使用MybatisPlus框架的小伙伴都会遇到多数据源的配置问题&#xff0c;并且官网也给出了推荐使用多数据源 (dynamic-datasource-spring-boot-starter) 组件来实现。由于最近项目也在使用这个组件来实现多数据源切换&#xff0c;因此想了解一下该组件是如何运行的&…

以太网协议和DNS

目录 &#x1f415;今日良言:跨过困难,去迎接更好的自己. &#x1f433;一、以太网桢格式 &#x1f433;二、DNS &#x1f415;今日良言:跨过困难,去迎接更好的自己. &#x1f433;一、以太网桢格式 数据链路层考虑的是相邻两个节点(通过网线/光纤/无线直接相连的两个设备…

有趣的表盘布局环绕动画

前言 C端的介绍页中&#xff0c;设计师设计动画特效都非常有意思。这次遇到了“表盘内容元素环绕效果”&#xff0c;类似于表盘中的分针在一格一格运动一样&#xff0c;只是这次动画运动的元素不一样。 效果如下&#xff1a; 实现表盘布局 合理的运用JavaScrip的三角函数&am…

Malware Dev 01 - 免杀之 PPID Spoofing 原理解析

写在最前 如果你是信息安全爱好者&#xff0c;如果你想考一些证书来提升自己的能力&#xff0c;那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里&#xff1a; https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助&#xff0c;并分享学习和实践过程…

第十五天笔记

1. 编程实现计算2023-2-1到2023-3-1相隔多少天&#xff1f; from datetime import datetimestart_date_str "2023-2-1"end_date_str "2023-3-1"start_date datetime.strptime(start_date_str, "%Y-%m-%d")end_date datetime.strptime(end_d…

pmp项目管理考完有什么好处?

作为曾经5A&#xff08;现在改3A了&#xff09;通过考试的老学姐说下经验 做好规划 一定要合理安排自己预习、复习和做题的时间&#xff0c;提前规划。其中不要小看课前预习这件事&#xff0c;带着问题去上课&#xff0c;绝对能事半功倍。同时也能及时知道老师到底在讲解哪个知…

网络安全入门:不可不知的8款免费Web安全测试工具

随着 Web 应用越来越广泛&#xff0c;Web 安全威胁日益凸显。黑客利用网站操作系统的漏洞和 Web服务程序的 SQL 注入漏洞等得到Web服务器的控制权限&#xff0c;轻则篡改网页内容&#xff0c;重则窃取重要内部数据&#xff0c;更为严重的则是在网页中植入恶意代码&#xff0c;使…

互联网时代,学什么专业就业好?

互联网时代的手机、智能电视、家具、机械设备等各种有形产品都将会嵌入智能芯片&#xff0c;都会有嵌入式软件或App与之相连&#xff0c;从而形成智能产品。这是我们开启智能化硬件的开始&#xff0c;在这样的环境下&#xff0c;如果要问学什么就业最好&#xff1f;当然首选Jav…

串口、终端应用程序 API termios

UART简介 串口全称为串行接口&#xff0c;也称为COM接口&#xff0c;串行接口指的是比特一位位顺序传输&#xff0c;通信线路简单。使用两根线就可以实现双向通信&#xff0c;一条为TX&#xff0c;一个为RX。串口通信距离远&#xff0c;但速度相对慢&#xff0c;是一种常用的工…

软测入门(二)测试用例、自动化测试理念

测试用例&#xff08;test case&#xff09; 特性 有效性&#xff1a;测试用例能够被使用&#xff0c;且被不同的人员使用测试结果一致可复用性&#xff1a;如回归测试的使用可评估性可管理性 八大要素 测试编码&#xff1a;方便归档和查询测试模块/功能预置条件&#xff1a…

2023年功能测试还值得入行吗?

前言 鉴于笔者从13年入行IT行业&#xff0c;经历了只有开发没有测试的阶段&#xff0c;经历了14年只要会基本的功能测试在一线就能薪资过万的阶段&#xff0c;经历了17年只要会一点自动化&#xff0c;会一点性能就能蒙骗过面试官的阶段&#xff0c;更经历了19年所有面试官对于…

操作系统发展历程

手工操作阶段(此阶段无操作系统) 用户在计算机上算题的所有工作都要人工干预。该阶段有两个突出缺点&#xff1a; 用户独占全机&#xff0c;虽然不会出现因资源已被其他用户占用而等待的现象&#xff0c;但资源利用率低。 CPU等待手工操作&#xff0c;CPU的利用不充分 唯一的…

【虚拟机搭建】win11搭建虚拟机两种方式:【virtualbox+vagrant】【VMware】(附centos系统、附安装包)

描述 本教程windows系统搭建虚拟机方式&#xff0c;主要包含两种方式&#xff0c;分别是&#xff1a;【vagrantvirtualbox】和【VMware】推荐大家使用【vagrantvirtualbox】方式进行安装&#xff0c;也可根据自己喜好进行选择本教程安装包 包含三种下载方式&#xff0c;分别是…

关于Could not build wheels for opencv-python-headless, which is...报错的解决方案

在通过最新版pip在线安装package&#xff1a;opencv-python-headless的时候&#xff0c;会产生报错信息&#xff0c;主要为 ERROR: Failed building wheel for opencv-python-headless ERROR: Could not build wheels for opencv-python-headless, which is required to insta…

Active Directory(活动目录)用户登录管理

活动目录用户登录管理 ADManager Plus 通过其预定义的用户登录报告简化了跟踪&#xff0c;监控和整合Active Directory用户登录特定数据的艰巨任务。Active Directory用户登录特定信息&#xff0c;如登录时间&#xff0c;登录历史记录&#xff0c;登录尝试&#xff0c;用户登录…

【钓鱼实测】写bug给new bing和chatGPT查。问他们林黛玉倒拔垂杨柳

BUG 错误代码 #include <iostream> #include <vector> using namespace std; int main() {vector<int> vec{1,2,3,2,4};for (auto iter vec.begin(); iter ! vec.end(); iter ){if (*iter 2) {vec.erase(iter);}}cout << vec.size() << endl…

Elasticsearch:如何正确处理 Elasticsearch 摄取管道故障

在我之前的文章 “Elastic&#xff1a;开发者上手指南” 中的 “Ingest pipeline” 章节中个&#xff0c;我有很多文章是关于 ingest pipeline 的。在今天的文章中&#xff0c;我将重点介绍如何处理在摄取管道中的错误。在我之前的文章 “Elasticsearch&#xff1a;如何处理 in…

Mybatis-Plus 开发提速器:mybatis-plus-generator-ui

Mybatis-Plus 开发提速器&#xff1a;mybatis-plus-generator-ui 1.简介 github地址 &#xff1a; https://github.com/davidfantasy/mybatis-plus-generator-ui 提供交互式的Web UI用于生成兼容mybatis-plus框架的相关功能代码&#xff0c;包括Entity,Mapper,Mapper.xml,Se…