线程池-拒绝策略

线程池-拒绝策略

    • RejectedExecutionHandler
      • AbortPolicy
      • CallerRunsPolicy
      • DiscardPolicy
      • DiscardOldestPolicy
      • 自定义拒绝策略

核心线程已用尽 & 阻塞队列已满 & 超过最大线程数时,再向线程池提交任务,则会触发线程池的拒绝策略。

RejectedExecutionHandler

拒绝策略是由 RejectedExecutionHandler 接口定义的。

Java 默认提供了四种拒绝策略。

AbortPolicy

中止测试。这也线程池默认的拒绝策略。当线程池无法接受一个新的任务时,会抛出一个 RejectedExecutionException 异常。这种策略会导致任务出现丢失,且会出现抛异常的特殊情况。

image-20240714004714703

// 创建一个核心线程10个 最大线程10个 阻塞队列1个线程池public static final ThreadPoolExecutor THREAD_POOL_EXECUTOR =new ThreadPoolExecutor(10,10,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(1),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());public static void main(String[] args) {int errorSize = 0;for (int i = 0; i < 20; i++) {final int finalI = i;THREAD_POOL_EXECUTOR.execute(() -> {Thread thread = Thread.currentThread();String name = thread.getName();System.out.println("name:" + name + "-" + +System.currentTimeMillis() + " Start-index-" + finalI);try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("name:" + name + "-" + System.currentTimeMillis() + " End");});}}

这里可以看见只有11个任务( 10 核心线程在执行,1 个在等待队列中,这个时候线程池就不能接受任务了 )执行成功了,当接受12个任务的时候,这个时候抛出了 RejectedExecutionHandler 因为没有 try-catch 所以线程中断,后续的循环也不会走了。

image-20240714010854094

for 循环中加上try-catch,可以捕获到异常了,那么后续的 12-20 个任务也可以提交到线程池中,但依然会被执行拒绝策略。

public static void main(String[] args) {int errorSize = 0;for (int i = 0; i < 20; i++) {try {final int finalI = i;THREAD_POOL_EXECUTOR.execute(() -> {Thread thread = Thread.currentThread();String name = thread.getName();System.out.println("name:" + name + "-" + +System.currentTimeMillis() + " Start-index-" + finalI);try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("name:" + name + "-" + System.currentTimeMillis() + " End");});}catch (RejectedExecutionException e){e.printStackTrace();}}}

CallerRunsPolicy

当任务被拒绝时,线程池会让提交任务的线程来执行这个任务。这样可以确保任务不丢失,但会让提交任务的这个线程压力很大,阻塞时间会很久。

image-20240714004740735

// 将拒绝策略修改为后。
new ThreadPoolExecutor.CallerRunsPolicy()

这里可以看见是 main 线程去帮我们执行了这个任务。在现在的这个情况下main线程要执行slepp(3) 9 次,会大大的降低 main 线程的执行效率

image-20240714004049916

DiscardPolicy

丢弃任务。在线程池无法接受新任务的时候,则会执行将这个丢失掉,跳过执行。使用场景需要对任务丢失有极大的容忍度。

image-20240714004936413

// 将拒绝策略修改为后。
new ThreadPoolExecutor.DiscardPolicy()

只允许了 11 个任务,后续的 9 个全部丢失。

image-20240714005510519

DiscardOldestPolicy

丢弃最旧任务。当线程池无法接收新的任务时,线程池会将阻塞队列中等待时间最久的任务给丢掉到,将新的任务加入到阻塞队中。也就是将阻塞队列头部的任务出队,再将新任务入队。这样做的目的是牺牲最老的任务以容纳最新的任务。

image-20240714005845400

// 将拒绝策略修改为后。
new ThreadPoolExecutor.DiscardOldestPolicy()

执行了 11 个任务,前 10 个与最后一个。这是因为 12-19 个都被拒绝策略给丢弃掉不执行了。

image-20240714010005438

自定义拒绝策略

当 Java 提供的这四个拒绝策略你觉得不好用时,你可以自己定义这个拒绝策略来处理。也就是提供 RejectedExecutionHandler 接口的实现即可。

public static final ThreadPoolExecutor THREAD_POOL_EXECUTOR =new ThreadPoolExecutor(10,10,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(1),Executors.defaultThreadFactory(),// 使用当发生拒绝策略的时候使用forkJoinPool这个线程来执行任务new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {ForkJoinPool.commonPool().execute(r);}});

10 个被THREAD_POOL_EXECUTOR执行,10 个被forkJoinPool执行。

image-20240714010423309

当然这里不建议使用 ForkJoinPool 这种方式来处理,当大量任务会被执行拒绝策略的时候,这会导致ForkJoinPool的线程池无线扩充,最终导致内存异常等问题。这里只是举例慎用!!!!

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

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

相关文章

Python爬虫与文本到语音转换实战:获取并播报长沙天气

简介&#x1f495; 在本文中&#xff0c;我们将通过一个简单的Python脚本&#xff0c;演示如何使用网络爬虫技术获取长沙的天气信息&#xff0c;并使用文本到语音技术将天气信息播报出来。我们将使用pyttsx3库进行语音播报&#xff0c;使用requests库来发起网络请求&#xff0…

自动驾驶-2D目标检测

yolo及yolo的变体 anchor boxes (锚框) intersection over union 并集交集 用于计算两个边界框的差异程度 bounding box predictions 边界框预测 non maximum suppression非极大值抑制 为了分离这些边界框并为每个对象获得单个边界框&#xff0c;我们使用IOU。这种获取单…

2024-07-15 Unity插件 Odin Inspector4 —— Collection Attributes

文章目录 1 说明2 集合相关特性2.1 DictionaryDrawerSettings2.2 ListDrawerSettings2.3 TableColumnWidth2.4 TableList2.5 TableMatrix 1 说明 ​ 本章介绍 Odin Inspector 插件中集合&#xff08;Dictionary、List&#xff09;相关特性的使用方法。 2 集合相关特性 2.1 D…

2-34 小波神经网络采用传统 BP 算法

小波神经网络采用传统 BP 算法&#xff0c;存在收敛速度慢和易陷入局部极小值两个突出弱点。建立了基于遗传算法的小波神经网络股票预测模型 GA-WNN。该模型结合了遗传算法的全局优化搜索能力以及小波神经网络良好的时频局部特性。运用 MATLAB 对拟合和预测过程进行仿真。结果表…

<数据集>绝缘子缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2139张 标注数量(xml文件个数)&#xff1a;2139 标注数量(txt文件个数)&#xff1a;2139 标注类别数&#xff1a;8 标注类别名称&#xff1a;[insulator, broken disc, pollution-flashover, Two glass, Glassdirt…

李笑来思考框架的结晶《思考的真相》(2024 年新书)

点开文章的你肯定读过李笑来的书&#xff0c;比如讲认知的《财富自由之路》、讲管理自己的《把时间当做朋友》、讲财富底层逻辑的《财富的真相》、讲定投的《让时间陪你慢慢变富》等等。 李笑来的书不讲究华丽的文字&#xff0c;在意逻辑、论证的严谨&#xff0c;层层递进&…

数据结构之通过“ 队列 ”实现的“ 栈 ”功能。

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 本节内容是利用“ 队列 ”先进先出的特点 实现 “ 栈 ” 先进后出。 一、题目 1.1 题目描述&#xff1a; 请你仅使用两个队列实现一个后入先出&…

成为CMake砖家(1): 在Windows上查看CMake文档

大家好&#xff0c;我是白鱼。 在使用 CMake 的过程中&#xff0c;想必有不少朋友像我一样&#xff0c; 想在本地查看 CMake 文档。 首先安装 CMake, Installer 版本&#xff1a; 安装后&#xff0c;从开始菜单输入 CMake&#xff0c; 选择结果中的 “CMake Documentation”…

如何在 Shell 脚本中使用函数 ?

函数是一个可重用的代码块。我们经常把重复的代码放入一个函数中&#xff0c;并从不同的地方调用该函数&#xff0c;库是函数的集合。我们可以在库中定义常用的函数&#xff0c;其他脚本可以使用它们而无需复制代码。 Calling function 在 Shell 中&#xff0c;调用函数和调用…

1.33、激活可视化卷积神经网络(matalb)

1、激活可视化卷积神经网络原理及流程 激活可视化&#xff08;Activation Visualization&#xff09;指的是通过可视化神经网络中激活函数的输出&#xff0c;来理解神经网络是如何学习并提取特征的过程。在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;我们可以通过…

tomcat的优化、动静分离

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强&#xff0c;大项目不适应tomcat做为转发动态的中间件&#xff08;k8s集群&#xff0c;pytnon rubby&#xff09;&#xff0c;小项目会使用&#xff08;内部使用的&#xff09;动静分离 默认配置不适合生产环境&…

MySQl高级篇 -索引优化篇

索引 InnoDB采用了一个B数来存储索引&#xff0c;使得在千万级数据量的一个情况下&#xff0c;树的高度可以控制在3层以内&#xff0c;而层高代表磁盘IO的一个次数&#xff0c;因此基于索引查找可以减少磁盘IO的次数 MySQL的索引是在存储引擎层实现的&#xff0c;不同的存储引…

头歌资源库(31)象棋中马遍历棋盘的问题

一、 问题描述 二、算法思想 这是一个典型的深度优先搜索问题。 首先&#xff0c;我们创建一个mn的棋盘&#xff0c;并初始化所有的点为未访问状态。 然后&#xff0c;我们从(0, 0)位置开始进行深度优先搜索。 在每一步中&#xff0c;我们先标记当前位置为已访问&#xff0…

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只&#xff0c;内容变化已多单一的fragment&#xff0c;变成连续的&#xff0c;特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动&#xff0c;到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久&#xff0c;网上的方法基本上都试过了&#xff0c;终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

基于Python+Django+MySQL+Echarts的租房数据可视化分析系统

租房数据可视化 DjangoMySQLEcharts 基于PythonDjangoMySQLEcharts的租房数据可视化分析系统 Echarts 信息存储在数据库中 不含爬虫代码&#xff0c;或爬虫代码已失效 不支持登录注册 简介 基于DjangoMySQLEcharts的租房数据可视化系统通过连接数据库获取数据&#xff0c…

【格密码基础】旋转格的性质

目录 一. 回顾ZSVP问题 二. 基于ZSVP问题的密码系统 三. 格基旋转与Gram矩阵 四. 补充矩阵QR分解 4.1 矩阵分解 4.2 举例 前序文章请参考&#xff1a; 【格密码基础】详解ZSVP问题-CSDN博客 一. 回顾ZSVP问题 根据之前的讨论我们知道解决ZSVP问题的计算复杂度为&#x…

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP&#xff0c;后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案&#xff0c;可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署&#xff01;加密通道&#xff01;牢牢掌握通…

您需要了解的欧盟网络弹性法案

了解CRA包含的内容以及如何遵守。 什么是CRA&#xff1f; 《网络弹性法案》&#xff08;CRA&#xff09;是即将出台的欧盟法规&#xff0c;旨在确保在欧盟销售的所有数字产品和服务&#xff08;如连接到互联网的软件和硬件&#xff09;都采用强大的网络安全措施。 该法案要求…

【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序【图文讲解】

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux…