线程池之拒绝策略

线程池拒绝策略——CallerRunsPolicy 最近在搞线程池,用到了CallerRunsPolicy这个拒绝策略。 为什么选用CallerRunsPolicy? 因为考虑到数据一条都不能丢失,所以选择了CallerRunsPolicy策略。保证数据来了不会丢。天真的幻想着这策略好啊! 经过了一段时间的实战考验,发现了一个问题,数据处理不过来,经常堆积,这样还行能接受。 遇到什么问题? 在从单线程改用多线程后,阻塞队列在高峰期时经常是满的。 阻塞队列经常是满了,于是考虑从处理效率上入手,(同事解决的)优化了程序处理速度和数据库写入效率,缓解了这个问题,线 阅读详情

线程池的三个参数与拒绝策略的关系:

从上图中,我们看一下线程池是如何工作的。

(1).提交的线程任务 < corePoolSize,创建新线程来处理提交任务;

(2).提交线程任务 > corePoolSize, 任务放入缓存队列queueCapacity;

(3).提交线程任务 > corePoolSize,且缓存队列queueCapacity已满,但是线程任务 < maxPoolSize,创建新线程去处理提交任务;

(4).corePoolSize与queueCapacity已满,且线程任务 > maxPoolSize,此时执行拒绝策略。

总结:想要了解线程池什么时候触发拒绝粗略,需要明确上面三个参数的具体含义,是这三个参数总体协调的结果,而不是简单的超过最大线程数就会触发线程拒绝粗略,当提交的任务数大于corePoolSize时,会优先放到队列缓冲区,只有填满了缓冲区后,才会判断当前运行的任务是否大于maxPoolSize,小于时会新建线程处理,大于maxPoolSize时就触发了拒绝策略。也可以这么说当前提交任务数大于(maxPoolSize + queueCapacity)时就会触发线程池的拒绝策略了。

JDK自带的四种拒绝策略:

(1).CallerRunsPolicy(调用者运行策略)

public static class CallerRunsPolicy implements RejectedExecutionHandler {
        public CallerRunsPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                r.run();
            }
        }
    }

功能:当触发拒绝策略时,只要线程池没有关闭,就由提交任务的当前线程处理。

使用场景:一般在不允许失败的、对性能要求不高、并发量较小的场景下使用,因为线程池一般情况下不会关闭,也就是提交的任务一定会被运行,但是由于是调用者线程自己执行的,当多次提交任务时,就会阻塞后续任务执行,性能和效率自然就慢了。

(2).AbortPolicy(中止策略)

 public static class AbortPolicy implements RejectedExecutionHandler {
        public AbortPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            throw new RejectedExecutionException("Task " + r.toString() +
                                                 " rejected from " +
                                                 e.toString());
        }
    }

功能:当触发拒绝策略时,直接抛出拒绝执行的异常,中止策略的意思也就是打断当前执行流程

使用场景:这个就没有特殊的场景了,但是一点要正确处理抛出的异常。

ThreadPoolExecutor中默认的策略就是AbortPolicy,ExecutorService接口的系列ThreadPoolExecutor因为都没有显示的设置拒绝策略,所以默认的都是这个。

但是请注意,ExecutorService中的线程池实例队列都是无界的,也就是说把内存撑爆了都不会触发拒绝策略。当自己自定义线程池实例时,使用这个策略一定要处理好触发策略时抛的异常,因为他会打断当前的执行流程。

(3).DiscardPolicy(丢弃策略)

 public static class DiscardPolicy implements RejectedExecutionHandler {
        public DiscardPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        }
    }

功能:直接静悄悄的丢弃这个任务,不触发任何动作

使用场景:如果你提交的任务无关紧要,你就可以使用它 。因为它就是个空实现,会悄无声息的吞噬你的的任务。所以这个策略基本上不用了。

(4).DiscardOldestPolicy(弃老策略)

public static class DiscardOldestPolicy implements RejectedExecutionHandler {
        public DiscardOldestPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                e.getQueue().poll();
                e.execute(r);
            }
        }
    }

功能:如果线程池未关闭,就弹出队列头部的元素,然后尝试执行

使用场景:这个策略还是会丢弃任务,丢弃时也是毫无声息,但是特点是丢弃的是老的未执行的任务,而且是待执行优先级较高的任务。

泛微ecology9二次开发-附件上传-安全实践 本文深入探讨了泛微ecology9二次开发中附件上传功能的安全实践。针对原生接口的安全机制,文章提出了同源部署与服务端代理转发两大核心策略,并提供了基于Vue3和Element Plus的完整前端实现代码,重点解决了会话验证、权限控制及文件关联等关键安全问题,确保二次开发应用能安全、稳定地与ecology9系统集成。 阅读详情

相关推荐

Google 人机验证(reCaptcha)无法显示解决方案

Google 人机验证无法显示解决方案第一步 安装插件Chrome/Edge 电脑版Firefox 电脑版第二步 配置插件原理参考文章 前言:为了防止机器人攻击,国外很多网站都使用了 Google reCaptcha 验证码。reCaptcha 对于国外用户非常的友好,但是… 对于国内用户就不怎么友好了。究其原因,则是国内网络全线屏蔽 Google 服务,导致 reCaptcha 完全加载不出来。这样,国内玩家就无法在对应的网站进行下一步操作了。本方案可以解决 reCaptcha 无法加载的问题。 适用

qq_40713201的博客 8万+

线称池饱和策略:DiscardOldestPolicy解释

前言 最近一直在线程池中游泳,对于四种的线称饱和策略,看了无数片优快云文章,居然发现一堆博主连个DiscardOldestPolicy 策略都说不清楚,每次都是一句话,丢弃线称队列的旧的任务,将新的任务添加,我也是无语?那 什么叫旧的任务? 怎么算是旧的任务??? DiscardOldestPolicy 解释 我们知道,线称饱和状态(拒绝策略)一共分为4种: ThreadPoolExecutor...

it佳佳的博客 1万+

从2804云台电机到桌面机械臂:一个STM32/GD32玩家的FOC驱动踩坑全记录

本文详细记录了从2804云台电机到桌面机械臂的FOC驱动开发历程,涵盖了硬件选型、驱动方案优化、软件调试等关键环节。特别分享了L6234P驱动芯片的发热问题、AS5600编码器的I2C通信陷阱以及PID调参的实战经验,为DIY爱好者提供了宝贵的参考。

weixin_26897585的博客 482

【并发编程】- 线程池使用DiscardOldestPolicy策略、DiscardPolicy策略

DiscardOldestPolicy策略是当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,将被拒绝的任务添加到等待队列中。运行结果如下线程名Runnable4开始时间164754线程名Runnable1开始时间164754线程名Runnable0开始时间1647541647。...

老男孩的架构路 1956

卫星图像检测,分割,跟踪,超分辨率,数据集调研,以及论文笔记

目标检测,针对物体有很多类如桥,烟囱,罐子等,有静态图像下的检测,也就是图像源头多来自谷歌地图,但是前后帧没有任何联系,并且谷歌地图相对来说比较清楚,难度小一点,也有粗粒度以及较细粒度的检测,然后卫星视频的数据集较少,则可以通过前后帧的联系来辅助检测,并且卫星帧基本上只对车,船,飞机,火车进行检测,没有进行细粒度的检测即将车辆分类为卡车,皮卡,小轿车,但是关船,则可以分类为货船以及军舰,因为目前的卫星视频中小车实在太少了,难以进行更细粒度的检测。luojia 三号卫星。

zhangzhao147的博客 4707

AltiumDesigner 09安装过程破解问题 .

首先分享一下破解文件,网上总是下载不到,好不容易下载到了,放在网盘上,有需要的自取。AltiumDesigner 09破解文件。链接:https://pan.baidu.com/s/1ZGvbR_6T51hpcaFbQiMX5w 密码:qwvaAltiumDesigner 09安装安装文件,比较大,包含破解文件:链接:https://pan.baidu.com/s/1mfgragB519jpGfR...

xiaoxiao_rabbit的博客 3万+

Java(二十五)-- Java并发编程(三)

JUC 工具类、读写锁、线程池

bug 消灭师的博客 298

用Multisim和AD2复刻经典:手把手教你搭建μA741三角波-方波发生器(附完整避坑指南)

本文详细介绍了如何使用Multisim和AD2搭建基于μA741运算放大器的三角波-方波发生器,包括电路原理、Multisim仿真流程、AD2硬件搭建及调试技巧。通过对比理论计算、仿真和实测数据,深入分析器件非理想特性的影响,并提供16个典型问题的解决方案,帮助读者掌握波形发生器的设计原理和工程调试经验。

weixin_28744423的博客 284

Java 线程池之 四个拒绝策略

jdk中关于线程池的拒绝策略的接口的实现,暂时就四个,如下: AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。 CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。 DiscardOldestPolicy -- 当...

请叫我大师兄 1万+

迅投miniQMT量化交易实战指南:从入门到自动化交易系统构建

迅投miniQMT量化交易实战指南摘要 本文全面介绍迅投miniQMT量化交易系统的开发流程,重点包括: 环境配置:详细说明miniQMT极简模式的安装步骤,包括xtquant库获取、Python版本要求及验证方法 行情数据模块:解析xtdata模块的核心功能,包括: 获取板块分类与股票列表 查询合约基础信息 下载历史K线数据(支持tick、分钟、日线等周期) 交易执行模块:介绍xttrader模块的交易API,涵盖: 账户连接与初始化 订单管理(下单、撤单、查询) 持仓与资产查询 实战开发:提供可直接运行

huanghm88的专栏 667

数字人接大模型第二步:语音克隆

推荐XTTS-v2项目,由Coqui公司开发的语音生成模型,专为多语言语音克隆和生成设计。它支持17种语言,包括英语、西班牙语、法语、德语、意大利语、葡萄牙语、波兰语、土耳其语、俄罗斯语、荷兰语、捷克语、阿拉伯语、中文、日语、匈牙利语、韩语和印地语。XTTS-v2的核心优势在于其仅需6秒的音频片段即可实现语音克隆,无需大量的训练数据。此外,它还支持情感和风格转移、跨语言语音克隆以及多语言语音生成,采样率高达24kHz。地址:https://github.com/archwesome/XTTS-v2。

404

Java线程池中的拒绝策略

qq_45537574的博客 5756

Uniapp返回上一页并刷新:亲测有效的 goBack 实现技巧!

这个技巧在实际开发中非常常用,特别适合表单提交后返回列表刷新这类场景。比起依赖onShow或复杂的vuex状态同步,这种方式更直接、好维护,也不容易出 bug。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1843

四种线程池拒绝策略

一、前言 线程池,相信很多人都有用过,没用过相信的也有学习过。但是,线程池的拒绝策略,相信知道的人会少许多。 二、四种线程池拒绝策略 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize时,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略: ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutio...

疯一样的女子 15万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

线程池的拒绝策略

本文介绍和演示了四种线程池拒绝策略

annotation_PLZ的博客 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

线程池-四种拒绝策略总结

一、线程池的拒绝策略 线程池中,有三个重要的参数,决定影响了拒绝策略: corePoolSize - 核心线程数,也即最小的线程数。 workQueue - 阻塞队列 。 maximumPoolSize - 最大线程数 当提交任务数大于 corePoolSize 的时候,会优先将任务放到 workQueue 阻塞队列中。当阻塞队列饱和后,会扩充线程池中线程数,直到达到 maximumPoolSize 最大线程数配置。此时,再多余的任务,则会触发线程池的拒绝策略了...

alan_liuyue的博客 4万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

线程池八大拒绝策略

拒绝策略特点适用场景调用者线程执行被拒绝的任务,减轻线程池压力。并发量较小且不允许任务丢失的场景,任务执行时间较短。抛出异常,任务提交失败时明确反馈。需要明确处理任务提交失败的场景,适合对任务失败敏感的系统。静默丢弃被拒绝的任务,不抛出异常。对任务丢失不敏感的场景,如日志收集、监控数据等。丢弃队列中最旧的任务,优先处理新提交的任务。需要优先处理新任务的场景,如实时性要求较高的系统。Dubbo记录详细的日志和堆栈信息,帮助快速定位问题,抛出异常。

qq_43539664的博客 1387

线程池的四种拒绝策略

今天写线程池的时候由于设定了最大线程数,需要写拒绝策略,顺便就把4中拒绝策略记录一下! 1.AbortPolicy:ThreadPoolExecutor中默认的拒绝策略就是AbortPolicy。直接抛出异常也不处理 private static final RejectedExecutionHandler defaultHandler = new AbortPolicy(); 实现: ...

BruceMen的博客 3888

Java 线程池拒绝策略

Java 线程池拒绝策略

qq_34392295的博客 1595

线程池的拒绝策略_线程池 RejectedExecutionHandler 拒绝策略

线程池 RejectedExecutionHandler 拒绝策略分析 线程池 ThreadPoolExecutor 参数的 RejectedExecutionHandler 参数 拒绝策略RejectedExecutionHandler是一个接口:public interface RejectedExecutionHandler { void rejectedExecution(...

weixin_39662578的博客 1280

线程池-拒绝策略

当 Java 提供的这四个拒绝策略你觉得不好用时,你可以自己定义这个拒绝策略来处理。也就是提供接口的实现即可。10,60,// 使用当发生拒绝策略的时候使用forkJoinPool这个线程来执行任务@Override10 个被执行,10 个被执行。当然这里不建议使用这种方式来处理,当大量任务会被执行拒绝策略的时候,这会导致的线程池无线扩充,最终导致内存异常等问题。这里只是举例慎用!!!!当然这里不建议使用这种方式来处理,当大量任务会被执行拒绝策略的时候,这会导致。

假女吖的博客 1734

聊聊线程池的拒绝策略

Java线程池拒绝策略全面解析:内置策略包括AbortPolicy(抛出异常)、CallerRunsPolicy(调用者执行)、DiscardPolicy(静默丢弃)和DiscardOldestPolicy(丢弃旧任务),各有适用场景。自定义策略可通过异步重试队列、任务持久化或结合流控框架实现弹性处理。最佳实践需根据业务容忍度选择策略,关键系统建议持久化+告警,高并发场景推荐异步重试+限流。核心原则是宁可优雅降级也不让系统崩溃,实际案例证明合理策略可将订单丢失率显著降低。

moonNife的专栏 1922

线程池拒绝策略 开发中常用什么策略_线程池有哪 4 种拒绝策略?

本文我们一起学习线程池有哪 4 种默认的拒绝策略。线程池的拒绝策略若线程池中的核心线程数被用完且阻塞队列已排满,则此时线程池的资源已耗尽,线程池将没有足够的线程资源执行新的任务。为了保证操作系统的安全,线程池将通过拒绝策略处理新添加的线程任务。1. AbortPolicy第一种拒绝策略是 AbortPolicy,这种拒绝策略在拒绝任务时,会直接抛出一个类型为 RejectedExecutionE...

weixin_39991222的博客 1850

Java 线程池有哪些拒绝策略?

实现方式:实现接口,定义自己的逻辑。示例// 可以记录日志、重试或放入备用队列 } public static void main(String [ ] args) {// 触发自定义策略 executor . shutdown();} }// 可以记录日志、重试或放入备用队列 } public static void main(String [ ] args) {// 触发自定义策略 executor . shutdown();} }

qq_63553317的博客 1799
上一篇: 浅谈线程池
下一篇: CentOS安装ftp、telnet客服端、客户端
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值