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

#详细介绍!!! 线程池的拒绝策略(经典面试题)

本篇单独讲解线程池的拒绝策略,介绍了当线程池任务满了之后,线程池会以什么样的方式来响应添加进来的任务

目录

一:理解线程池拒绝策略的触发情况+代码理解

二:线程池的四种常见的拒绝策略

1.ThreadPoolExecutor.AbortPolicy

2.ThreadPoolExecutor.CallerRunsPolicy

3.ThreadPoolExecutor.DiscardOldestPolicy

4.ThreadPoolExecutor.DiscardPolicy 



一:理解线程池拒绝策略的触发情况+代码理解

当线程池容纳不了任务的时候,则会触发线程池的拒绝策略

线程池能同时容纳的任务数量:最大线程数+任务队列能存储的任务数

看代码理解:

public static void main(String[] args) {BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.AbortPolicy()) ;//此时线程池只有一个核心线程,且队列也只能存储一个任务//当我们添加第三个任务时,没地放了,此时会根据最大线程数来新建临时线程执行这个线程,此时创建了一个临时线程执行任务3//如果我们再添加任务四:此时最大线程数和存储的队列加起来只能拿到三个任务,那么此时任务四就没地方存储了//此时就会触发线程池的拒绝策略for (int i = 1; i <= 4; i++) {int num = i;pool.submit(new Runnable() {@Overridepublic void run() {while(true){System.out.println("正在执行线程"+num);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}});}}

此处创建了一个线程池pool,核心线程数为1,最大线程数为2,任务队列的长度为1

设置线程池的拒绝策略为ThreadPoolExecutor.AbortPolicy

运行结果:

       

详解: 

1.当添加第1个任务进线程池执行的时候,此时线程池直接创建核心线程来执行任务

2.当添加第2个任务进线程池执行的时候,此时还有存储空间,那么第2个任务进去任务队列,等待核心线程执行完毕再弹出任务2进行执行

3.当添加第3个任务进线程池执行的时候,此时核心线程在执行任务1,而任务队列又被任务2给占满了,那么任务3没地方去了,但此时线程数量还没到线程池的最大线程数,这个时候会自动创建临时线程来执行任务3,把任务3给拿走,避免任务3流失

4.当添加第4个任务进线程池执行的时候:此时核心线程数被占用,任务队列和最大线程数都满了,那么此时任务4彻底没地方去了,线程池只能被迫采用拒绝策略来处理当前问题

二:线程池的四种常见的拒绝策略

首先打开官方文档

        可查看到以下四种策略:

1.ThreadPoolExecutor.AbortPolicy

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.AbortPolicy()) ;

这种拒绝策略表示:当线程池最大的任务容量已满时,编译器直接抛出异常

上诉代码就是这种情况

通俗理解:

就好像在说,这个问题编译器傻眼了,处理不了,编译器给你一个异常你自己看着办。

2.ThreadPoolExecutor.CallerRunsPolicy

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.CallerRunsPolicy()) ;

这种拒绝策略表示:当线程池最大的任务容量已满时,线程池不处理该任务,让添加该任务的线程自己执行

例如前面代码案例如果设置为这个拒绝策略,那么是main线程添加任务4进线程池被拒绝了,此时main线程自己执行任务4

通俗理解:

我把一个任务交给你执行,你自己也没空闲时间,所以你让我自己去做这个任务

3.ThreadPoolExecutor.DiscardOldestPolicy

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.DiscardOldestPolicy) ;

把前面例子改变一下:设置拒绝策略为DiscardOldestPolicy

        并且把代码的死循环改为执行3秒

public static void main(String[] args) throws InterruptedException {BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.DiscardOldestPolicy()) ;//此时线程池只有一个核心线程,且队列也只能存储一个任务//当我们添加第三个任务时,没地放了,此时会根据最大线程数来新建临时线程执行这个线程,此时创建了一个临时线程执行任务3//如果我们再添加任务四:此时最大线程数和存储的队列加起来只能拿到三个任务,那么此时任务四就没地方存储了//此时就会触发线程池的拒绝策略for (int i = 1; i <= 4; i++) {int num = i;pool.submit(new Runnable() {@Overridepublic void run() {boolean start = true;long time = System.currentTimeMillis();while(start){System.out.println("正在执行线程"+num);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if(System.currentTimeMillis() - time >= 3000){start = false;}}}});}}

此时代码结果:

 

这种拒绝策略表示:当线程池最大的任务容量已满时,线程池拒绝(删除掉)最老的任务,再把当前任务添加进线池

例如前面代码案例如果设置为这个拒绝策略,那么线程池就把任务队列中最早添加的(最老的)的任务2给删除,再把任务4添加进线程池

通俗理解:

我把任务交你执行,你手底下也有很多任务也没时间做,此时你放下把后续任务中的最早添加的任务给剔除,再把新任务加入后续执行的任务中

4.ThreadPoolExecutor.DiscardPolicy 

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1);
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.DiscardPolicy ) ;

这种拒绝策略表示:当线程池足底啊的任务容量已满时,线程池拒绝最新添加的任务

 例如前面代码案例如果设置为这个拒绝策略,那么线程池就直接拒绝任务4,不接收任务4

通俗理解:

我把任务交你执行,你手底下也有很多任务也没时间做,此时你直接拒绝这个任务,不做这个任务,那么这个任务就流失了


 

 

 

相关文章:

#详细介绍!!! 线程池的拒绝策略(经典面试题)

本篇单独讲解线程池的拒绝策略&#xff0c;介绍了当线程池任务满了之后&#xff0c;线程池会以什么样的方式来响应添加进来的任务 目录 一&#xff1a;理解线程池拒绝策略的触发情况代码理解 二&#xff1a;线程池的四种常见的拒绝策略 1.ThreadPoolExecutor.AbortPolicy 2…...

正则表达式作业

利用正则表达式完成下面的操作: 一、不定项选择题 能够完全匹配字符串"(010)-62661617"和字符串"01062661617"的正则表达式包括&#xff08;A &#xff09; A. r"\(?\d{3}\)?-?\d{8}" B. r"[0-9()-]" C. r"[0-9(-)]*\d*&qu…...

《扬帆优配》交易拥挤度达历史极值 当前A股TMT板块性价比几何?

上周&#xff0c;A股商场企稳&#xff0c;但盘面风格分歧再度加深&#xff1a;很多资金涌入以ChatGPT、数字经济为代表的TMT板块&#xff0c;而新能源以及前期强势的“中字头”种类都呈现了回调。兴业证券计算显现&#xff0c;3月24日&#xff0c;TMT及电子板块的商场成交金额占…...

C/C++开发,无可避免的IO输入/输出(篇三).字符串流(内存流)IO处理

目录 一、字符串流 1.1 字符串流继承体系 1.2 字符串流本质-类模板std::basic_stringstream 1.3 字符串流缓冲-std::stringbuf 1.4 stringbuf与序列缓冲 1.5 字符串流的打开模式 二、字符串流的运用 2.1 格式转换是其拿手好戏 2.2 字符串流仅提供移动赋值 2.3 std::basic_str…...

什么是HTTP请求?【JavaWeb技术】

HTTP请求是指从客户端到服务器的请求消息&#xff0c;建立HTTP请求需要经历以下7个步骤才能请求成功。 (1)建立TCP连接 在HTTP开始工作前&#xff0c;Web浏览器需先通过网络和Web服务器连接&#xff0c;连接过程主要使用TCP/IP完成。 (2)Web浏览器向Web服务器发送请求命令 一旦…...

浅聊面试这件事

目录 哪个时间点适合跳槽 如何准备面试 面试原则 面试常见问题 哪个时间点适合跳槽 金三银四、金九银十&#xff0c;这些都&#x1f4cc;标记为我们的最佳跳槽节点&#xff0c;但是这些节点真的是最佳的么&#xff0c;也需要因人而异。 如果公司年前不发年终奖&#xff0c…...

【致敬未来的攻城狮计划】连续打卡第7天+瑞萨RA2E1点亮LED

开启攻城狮的成长之旅&#xff01;这是我参与的由 CSDN博客专家 架构师李肯&#xff08;http://yyds.recan-li.cn&#xff09;和 瑞萨MCU &#xff08;瑞萨电子 (Renesas Electronics Corporation) &#xff09; 联合发起的「 致敬未来的攻城狮计划 」的第 7 天&#xff0c;点击…...

Sam Altman专访:GPT-4没太让我惊讶,ChatGPT则让我喜出望外

导读ChatGPT、GPT-4 无疑是 2023 年年初人工智能界最大的「爆款」。3 月 26 日&#xff0c;OpenAI CEO、ChatGPT 之父 Sam Altman 接受了著名学者与科技播客、麻省理工大学研究员 Lex Fridman 的专访&#xff0c;Sam 分享了从OpenAI内部视角如何看待ChatGPT和GPT-4的里程碑式意…...

弯道超车的机会

弯道超车的机会 原文地址&#xff1a;https://bmft.tech/#/1-throught/0302-chance 前言 我一直很想把自己思考的东西表达出来&#xff0c;苦于语文成绩差&#xff0c;文字功力不够&#xff0c;想来想去也不知道用什么话来开场。我不喜欢站在高处对别人指指点点&#xff0c;…...

【设计模式】创建型模式之原型模式

【设计模式】创建型模式之原型模式 文章目录【设计模式】创建型模式之原型模式1.概述2. 构成3. 实现3.1 浅克隆3.2 深克隆1.概述 原型模式(Prototype Pattern)&#xff1a;是用于创建重复的对象&#xff0c;同时又能保证性能。这种类型的设计模式属于创建型模式&#xff0c;它…...

KMP算法——我欲修仙(功法篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️我欲修仙】 学习名言&#xff1a;莫等闲、白了少年头&#xff0c;空悲切。——岳飞 系列文章目录 第一章 ❤️ 学习前的必知知识 第二章 ❤️ 二分查找 文章目录系列文章目录前言&#x1f697;&…...

【嵌入式Linux学习笔记】QT在Linux嵌入式设备上的使用

QT是目前主流的UI界面设计软件之一&#xff0c;Linux系统也支持QT应用&#xff0c;并且提供了很多方便的接口。所以有必要记录一下基于QT&#xff0c;在LCD屏幕上实现UI界面功能的各种细节。 学习视频地址&#xff1a;【正点原子】STM32MP157开发板 1. 系统配置 出于方便&am…...

js根据数据关键字实现模糊查询功能

js根据数据关键字实现模糊查询功能模糊查询实现模糊查询功能的步骤和一般方法第一步&#xff1a;创建假数据或请求接口数据第二步&#xff1a;分析数据格式&#xff0c;处理数据第三步&#xff1a;验证功能完整代码模糊查询 模糊查询功能是指在搜索或者查询时&#xff0c;允许…...

java获取对象属性

Field[] fields vo.getClass().getDeclaredFields(); for (Field field : fields) {//设置允许通过反射访问私有变量field.setAccessible(true);//获取字段的值String value "";Class<?> type field.getType();if (Date.class.equals(type)) {value DateU…...

51单片机(IIC协议OLED屏)

一、IIC协议 1、IIC协议概述 1.1、概述&#xff1a;IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式 1.2、特点&#xff1a;简单性和有效性。 由于接口直…...

你知道,华为对项目经理要求的3项技能5项素质是什么吗?

很多人一定在好奇&#xff0c;华为对项目经理的要求是什么呢&#xff1f;普通项目经理应具备什么素质&#xff0c;才能进入华为这样的大厂&#xff0c;在严峻的经济形势下无惧裁员呢&#xff1f; 一、三项软技能 我们在华为举办的项目经理论坛中找到了答案&#xff1a;对于华…...

优漫动游 提升效率常用的C4D技巧

C4D是近几年非常热的趋势&#xff0c;经常有人问3D相关的问题&#xff0c;想把自己在找捷径的过程中觉得最实用的小技巧分享给大家   1、快速定位层级和模型   模型的过程中&#xff0c;经常遇到模型层级多难定位的问题&#xff0c;逐级打开或者全部展开对于定位模型使…...

基于蚁群算法的时间窗口路径优化

目录 背影 蚁群算法的原理及步骤 基本定义 编程思路 适应度函数 算法的规则 特点 主要参数 代码 结果分析 展望 背影 现代物流配送对时间要求更高,是否及时配送是配送是否成功的重要指标,本文对路径优化加时间窗口,实现基于蚁群算法的时间窗口路径优化, 蚁群算法 基本…...

liunx

linux常用命令 mkdir &#xff1a;创建文件夹 rm -f &#xff1a;删除文件 docker cp 文件名 20f:容器内地址 将文件从linux系统移动到docker地址 ln -s 将两个文件做链接 compgen -u 查看所有用户 groups 查看所在组 vim 编辑 quit 退出 sudo su - root 获得root权限 cp dir1/…...

机动车发票组件【vue】

发票组件 问题反馈&#xff1a;在这就可以 Install-下载 npm install motorvehicles --savewarrning&#xff1a;我们推荐您设置key的&#xff0c;因为不存在它会带来数据的复用性问题usage-使用说明 import MotorVehiclesIvoice from motorvehiclesimport MotorVehiclesIvo…...

学习笔记-剖析k8s之StatefulSet的拓扑状态-3月day18

文章目录前言StatefulSetHeadless ServicePod的拓扑状态小结附前言 Deployment实际上并不足以覆盖所有的应用编排问题&#xff0c;原因在于Deployment对应用做了一个简单化的假设&#xff1a;一个应用的所有Pod&#xff0c;是完全一样的。所以&#xff0c;它们互相之间没有顺序…...

Java实现输出九九乘法口诀表,输入行数输出对应的梯形(平行四边形)这两个代码

目录 一、前言 二、代码部分 1.输出九九乘法口诀表的代码 三、程序运行结果&#xff08;控制台输出&#xff09; 一、前言 1.本代码是我在上学时写的&#xff0c;有一些地方没能完美实现&#xff0c;请包涵也请多赐教&#xff01; 2.本弹窗界面可以根据简单的要求进行输…...

C++空间配置器

目录 1.什么是空间配置器 2.为什么需要空间配置器 3.SGI-STL空间配置器实现原理 3.1一级空间配置器 3.2二级空间配置器 3.2.1内存池 3.2.2 SGI-STL中二级空间配置器设计 3.3 空间配置器的默认选择 4.空间配置器与容器的结合 1.什么是空间配置器 空间配置器&#xff0…...

JConsole使用教程

JConsole是一个Java虚拟机的监控和管理工具&#xff0c;可以监控Java应用程序的内存使用、线程和类信息等。 以下是JConsole的使用教程&#xff1a; 1.启动JConsole JConsole是一个Java自带的工具&#xff0c;可以在bin目录下找到jconsole.exe文件。双击运行该文件即可启动JC…...

JS手写防抖和节流函数(超详细版整理)

1、什么是防抖和节流防抖&#xff08;debounce&#xff09;&#xff1a;每次触发定时器后&#xff0c;取消上一个定时器&#xff0c;然后重新触发定时器。防抖一般用于用户未知行为的优化&#xff0c;比如搜索框输入弹窗提示&#xff0c;因为用户接下来要输入的内容都是未知的&…...

我的Macbook pro使用体验

刚拿到Mac那一刻&#xff0c;第一眼很惊艳&#xff0c;不经眼前一亮&#xff0c;心想&#xff1a;这是一件艺术品&#xff0c;太好看了吧 而后再体验全新的Macos 系统&#xff0c;身为多年的win用户说实话一时间还是难以接受 1.从未见过的访达&#xff0c;不习惯的右键 2. …...

炼石入选“首届工业和信息化领域商用密码应用峰会”典型方案

2023年3月22日-23日&#xff0c;浙江省经济和信息化厅、浙江省通信管理局、浙江省密码管理局、工业和信息化部商用密码应用产业促进联盟联合举办的“首届工业和信息化领域商用密码应用峰会”&#xff08;以下简称峰会&#xff09;在浙江杭州成功举办&#xff0c;旨在深入推进工…...

使用new bing chat成功了

步骤一:在扩展商店搜索并安装modheader 打开浏览器; 点击右上角的三个点图标,选择“更多工具” -> “扩展程序”; 在扩展程序页面上方的搜索框中输入“modheader”,然后点击“搜索商店”; 在搜索结果中找到“ModHeader”扩展程序,点击“添加至”按钮,然后再点击“添…...

Golang每日一练(leetDay0019)

目录 55. 跳跃游戏 Jump Game &#x1f31f;&#x1f31f; 56. 合并区间 Mmerge Intervals &#x1f31f;&#x1f31f; 57. 插入区间 Insert Interval &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练…...

记录一次性能测试遇到的问题

零、压测指标问题 压测指标&#xff0c;一定要需求方定 啊&#xff0c;谁提压测需求&#xff0c;谁来定压测指标。 如果需求方&#xff0c;对压测指标没有概念&#xff0c;研发和测试&#xff0c;可以把历史压测指标、生产数据导出来给需求方看&#xff0c;引导他们来定指标&…...