ThreadPoolTaskExecutor同时自定义线程拒绝策略,防止线程太多造成线程池将任务丢弃

从ScheduledThreadPoolExecutor的任务突然不再跑了, 再看线程池ThreadLocalPool基本原理 要搞清楚为啥FixedThreadPool可以间隔一段时间跑一次, 之前看线程池源码可知, 对于线程池重要的两个方法, 一个是take一个poll, 分别表示是否允许淘汰worker, 来从等待队列获取任务, poll的情况表示允许淘汰worker。但是发现有些时候跑着跑着, 就没有执行的日志继续打印出来了,也就是不知道为什么线程池突然挂了, 猜测是因为异常了导致的.其实应该想到, 线程池对于线程的异常处理, 其实是有坑的, 比如常常见到的。方法, 可以看到调用了父类的run方法, 同样的是。 阅读详情
@Bean("lcAsyncServiceExecutor")
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
    threadPoolTaskExecutor.setCorePoolSize(COUR_SIZE);
    threadPoolTaskExecutor.setMaxPoolSize(MAX_COUR_SIZE);
    //根据业务场景设置队列长度
    threadPoolTaskExecutor.setQueueCapacity(400);
    //允许线程的空闲时间60秒:当超过了核心线程数之外的线程在空闲时间到达之后会被销毁
    threadPoolTaskExecutor.setKeepAliveSeconds(60);
    threadPoolTaskExecutor.setThreadNamePrefix("BPExecutor-");
    threadPoolTaskExecutor.setRejectedExecutionHandler(new BPConfig.BuriedPointRunsPolicy());
    return threadPoolTaskExecutor;
}

/**
 * 自定义拒绝策略
 */
public static class BPRunsPolicy implements RejectedExecutionHandler {
    public BPRunsPolicy() { }
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if(r instanceof  BPTaskManager.BPThread){
            BPTaskManager.BPThread bPThread = (BPTaskManager.BPThread)r;
            //先做存储再更新状态
            bPThread.markBPReport();
            bPThread.failBPReport();
BlockingQueue<Runnable> queue = bPTaskManager.getThreadPoolTaskExecutor().getThreadPoolExecutor().getQueue();
queue.stream().forEach(qu->{BPTaskManager.BPThread thread=(BPTaskManager.BPThread)qu;
    if("69d".equals(thread.bPLogEntityBody.getBPInfo().buriId)){
        log.info("我是true======{}",thread.bPLogEntityBody.getBPInfo().buriedId);
    }else{
        log.info("我是false====={}",thread.bPLogEntityBody.getBPInfo().buriedId);
    }      
});
        }
    }
}

1.TransmittableThreadLocal中TtlRunnable使用spring框架中的ThreadPoolTaskExecutor线程池,如果自定义线程池不加名字时会和TtlRunnable使用同一个spring的ThreadPoolTaskExecutor线程池,并会将任务交给ThreadPoolTaskExecutor线程池处理任务。

2.请求任务太多时,连阻塞队列都放不下时,线程池会直接做丢弃,此时应

判断超过阻塞队列内的任务数1半时,将请求线程休眠1s钟,伪代码如下:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.size(200);
QueryBuilder matchQueryBuilder = QueryBuilders.rangeQuery("body.bPInfo.reqInfo.reqTime").gte(begin).lte(end);
searchSourceBuilder.query(matchQueryBuilder);
searchSourceBuilder.sort("body.bPInfo.reqInfo.reqTime", SortOrder.ASC);
List<Data> bPLogPage = new ArrayList<>(1000);//list在外面建,不用每次查询再建,指定初始值
ScrollDto scrollDto = new ScrollDto();//持有scrollId
do{
bPLogPage.clear();
while (bPTaskManager.getThreadPoolTaskExecutor().getThreadPoolExecutor().getQueue().size() > 200){
//休眠一秒
    try{
        Thread.sleep(1000);
    }catch (Exception e){}
}
//从es中查询出一批数据处理一批数据,防止OOM内存溢出logService.getDocByDate(bPLogEntity,searchSourceBuilder,bPLogPage,scrollDto);
if(CollectionUtils.isNotEmpty(bPLogPage)){
    bPLogPage.stream().forEach(bP -> {
        if(null!=bP.getBody() && null != bP.getBody().getBPInfo()){
            //将查询的数据推送给线程执行器
            bPTaskManager.pushTask(bP.getBody());
        }
    });
}
}while(null !=bPLogPage && bPLogPage.size() > 0)

Java线程池的拒绝策略 拒绝策略被设置为CallerRunsPolicy,即当任务被拒绝时,由提交任务的线程来执行该任务。这是线程池默认的拒绝策略。在这个示例中,我们创建了一个线程池,并设置核心线程数为2,最大线程数为4,使用有界队列(大小为3)。DiscardOldestPolicy:当任务被拒绝时,丢弃队列中最老的一个任务,并尝试再次提交被拒绝的任务。,这意味着当线程池无法处理新的任务时,会丢弃队列中的最早的任务,并尝试将新的任务添加到队列中。,这意味着当线程池无法处理新的任务时,会默默地丢弃被拒绝的任务,不抛出任何异常。 阅读详情

相关推荐

VS2015+Qt+OpenCV+open62541开发过程(05_VS2015中使用OPCUA open62541通过Kepware读写PLC数据)

此外还需要所需lib包:WS2_32.Lib(opcua通讯用到的库,opcua使用socket通讯,需使用此库),添加#pragma comment(lib,"ws2_32.lib") 语句,有的文章说需要添加ws2_32.lib文件或ws2_32.dll到项目资源中,貌似影响不大。2.在VS中选择x64平台会报错,选择x86平台可以用,应该是ws2_32.lib相关的库不支持64位,目前没有解决,继续后面的实验,看看用Qt后是否可以解决。6.VS中建立的变量,与读取的OPC点数据类型注意对应。

zzh17的博客 1862

SPRING中的线程池ThreadPoolTaskExecutor

一、初始化 1,直接调用 ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor(); //线程池所使用的缓冲队列 poolTaskExecutor.setQueueCapacity(200); //线程池维护线程的最少数量 poolTaskExecutor.setCorePoolSize(5); //线程池维护

8万+

用户消费行为分析(MapReduce实现,Hive分析)

一、题目要求 数据来自CDNow网站的一份用户购买CD明细,本数据集共有 6 万条 左右数据,数据为 CDNow 网站 1997年1月至1998年6月的用户行为 数据

紫烟的博客 3013

【Java进阶】线程池之参数介绍、拒绝策略、有限队列线程池,使用ThreadPoolTaskExecutor进行介绍

@Configuration public class ThreadPoolConfig { @Bean(name = "testThreadPool") public ThreadPoolTaskExecutor createPool(){ ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor(); //线程池所使用的缓冲队列 poolTaskExecut.

卡萨的博客 2899

DP83848以太网PHY芯片:自动协商与MII/RMII接口实战解析

以太网物理层(PHY)芯片是嵌入式网络通信的核心,负责数字信号与模拟信号的转换,其稳定性和兼容性直接影响系统性能。其工作原理基于IEEE标准,通过管理接口(MDC/MDIO)配置内部寄存器,实现链路速率、双工模式等关键参数的设定。这项技术的核心价值在于为工业控制、汽车电子等严苛环境提供可靠、自适应的网络连接。在实际应用中,PHY芯片通过自动协商(Auto-Negotiation)功能与对端设备智能匹配最佳通信模式,极大提升了产品的易用性。同时,其支持的MII与RMII接口为硬件设计提供了灵活性,前者是标准并

weixin_29189987的博客 374

从KVM虚拟化到Openstack云化架构综述

目录 摘要 OpenStack的虚拟化技术 OpenStack架构介绍 Nova Swift KeyStone Neutron Glance Cinder Ceilometer Heat 摘要 这两年的工作中,接触到公有云和私有云的项目还不少。起初对于Openstack的了解,仅停留在其几大组件的交互上,如Nova、Neutron、Glance等,以及对各大云厂商功能点上...

liyunpeng229的博客 2051

ThreadPoolTaskExecutor自定义线程大小及队列设量标准

ThreadPoolTaskExecutor自定义线程大小及队列设量标准

qq_40549814的博客 6298

STM32H7系列QSPI内存映射模式与MPU配置冲突分析

本文分析了STM32H7系列QSPI内存映射模式与MPU配置冲突导致系统卡死的问题。通过解析内存保护管理单元机制,提供了MPU配置调整方案,包括禁用MPU或精细配置QSPI区域权限,确保内存映射模式正常访问外部Flash,避免HardFault错误。

js777的博客 740

线程过多导致性能问题?解析3000+线程线上事故与线程池优化策略

并发编程中,线程数并非多多益善。当大量线程陷入阻塞和等待,系统性能不升反降,CPU空闲却接口超时。这背后是上下文切换开销、内存占用与锁竞争等底层原理在起作用。掌握线程池的容量规划与参数配置,是有序管理并发资源、保障服务稳定性的关键技术。通过压测确定吞吐拐点、设置合理队列与拒绝策略,能有效防止线程堆积引发故障放大。面对线上事故,可借助jstack等工具快速定位线程状态,并结合监控告警提前发现风险。以一次线程数突破3000的真实线上事故为例,从成因、排查方法到优化实践,系统性梳理线程过多导致性能问题的完整应对方

weixin_33994429的博客 285

AI赋能运筹优化:从参数生成到智能求解的工程实践

运筹学通过线性规划、整数规划等数学模型,为供应链、物流、生产排程等复杂决策问题寻找最优解,其核心价值在于提升资源利用效率与决策科学性。传统方法依赖精确的输入参数与专家经验,面临数据不准、建模门槛高、求解调优难等挑战。人工智能技术的引入,正从原理层面重塑这一流程:通过深度学习模型生成更贴合现实的动态参数(如需求分布、行驶时间),利用自然语言处理降低建模门槛,并借助强化学习对求解器进行智能参数调优。这种AI与运筹学的融合,在工程实践中显著提升了优化系统的自适应能力与求解效率,使其在应对实时交通、柔性生产调度等动

weixin_26913055的博客 595

手把手教你学Simulink——基于自动驾驶辅助系统的场景实例:车道保持辅助系统(LKA)的仿真与实现

本文通过Simulink实例讲解车道保持辅助系统(LKA)的实现方法。首先介绍LKA从预警到主动控制的技术演进,阐述其系统架构、核心组件和工作原理。重点演示基于自行车模型的车辆横向动力学建模过程,以及使用线性二次调节器(LQR)设计横向控制器的详细步骤。教程包含四个仿真场景测试,分析关键指标如控制精度、舒适性和响应性。最后探讨LKA技术的发展方向,强调人机协同的安全理念。该实例为自动驾驶辅助系统开发提供了完整的Simulink实践方案。

MHD0815的博客 182

Java线程池参数设计与生产环境调优实战

线程池作为Java并发编程的核心组件,其工作原理基于任务队列与线程复用机制,能有效提升系统吞吐量并降低资源消耗。从技术实现看,通过corePoolSize控制常驻线程,maximumPoolSize应对突发流量,配合BlockingQueue实现任务缓冲,构成了经典的生产者-消费者模型。在电商秒杀、金融支付等高并发场景中,合理的线程池参数设计可避免订单积压和响应延迟问题。本文结合CPU密集型与IO密集型任务特点,给出线程数计算公式,并详解ArrayBlockingQueue、LinkedBlockingQu

weixin_34043301的博客 382

Autosar MCAL-S32K324 Fee配置-基于EB

Autosar MCAL S32K324 Fee配置详解

赞的博客 1544

Java线程池七种创建方式详解:从核心参数到生产实践避坑指南

在并发编程中,线程池是管理多线程执行、提升系统性能与稳定性的核心组件。其核心原理在于复用线程资源,通过预先创建并管理一组工作线程,避免了频繁创建和销毁线程带来的开销。线程池的技术价值在于提供了可控的并发执行能力,通过核心线程数、最大线程数、工作队列及拒绝策略等关键参数的组合,能够有效应对不同负载场景,防止资源耗尽。典型的应用场景包括Web服务器请求处理、批量数据处理、异步任务执行等。本文聚焦于Java线程池的七种创建方式,深入剖析了每种方式背后的参数配置、适用场景与潜在隐患,例如使用无界队列可能导致的**内

weixin_30644369的博客 402

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring @Async 实战指南:线程池配置、上下文透传与故障恢复

@Async 是 Spring 提供的声明式异步编程机制,其本质是基于 AOP 代理与 TaskExecutor 线程池协同工作的任务调度方案。它通过拦截标注方法、封装为 Runnable 并提交至受管线程池,实现 I/O 密集型操作与主流程解耦。技术价值在于统一资源管控、支持上下文传播(如 MDC/TraceId)及可观测性集成,显著提升服务吞吐量与响应稳定性。典型应用场景包括第三方 API 调用、消息通知、报表生成等非关键路径阻塞操作。本文聚焦生产级落地难点:线程池参数调优逻辑、self-invocat

weixin_30553777的博客 463

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java多线程面试核心:从JMM、锁机制到线程池调优与并发容器实战

并发编程是构建高性能、高可靠分布式系统的基石,其核心在于解决多线程环境下的数据一致性与资源协调问题。Java内存模型(JMM)定义了线程间共享变量的访问规则,是理解可见性、有序性等线程安全问题的理论基础。基于此,Java提供了synchronized内置锁、ReentrantLock显式锁以及volatile、原子变量等多种同步机制,以满足不同场景下的互斥与通信需求。在实际工程中,线程池(ThreadPoolExecutor)是管理线程生命周期、控制并发度的关键组件,其核心参数如核心线程数、工作队列和拒绝策

weixin_34161029的博客 535

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

线程池原理详解:从execute执行路径到参数调优实战

在Java并发编程中,线程池是应对高并发、控制资源开销的核心机制。其底层原理基于生产者-消费者模型,通过线程复用和任务队列缓冲,实现了对稀缺线程资源的统一调度。理解ThreadPoolExecutor的七个参数与execute()执行路径,是掌握线程池原理的关键。配置核心线程数、最大线程数及选型有界队列,能够削峰填谷,防止任务无限堆积;合理的拒绝策略则能在系统过载时提供兜底方案。在实际应用中,从CPU密集型到IO密集型场景的线程数估算,再到队列选择与动态调参,线程池的工程实践处处体现着资源管理的智慧。本文围

weixin_26875109的博客 302

Java多线程核心原理与实战:从synchronized到JUC并发工具深度解析

在并发编程领域,线程安全是保障程序正确性的基石。其核心原理源于Java内存模型(JMM),它定义了主内存与工作内存的交互规则,是理解可见性、有序性等问题的理论根源。为实现线程安全,Java提供了从语言原语到高级框架的多层次解决方案。synchronized关键字通过对象头与锁升级机制(无锁、偏向锁、轻量级锁、重量级锁),在保证原子性的同时兼顾性能优化。而volatile关键字则通过内存屏障确保变量的可见性与有序性,是轻量级同步的典型代表。在工程实践中,为应对复杂并发场景,Java并发工具包(JUC)提供了更

weixin_33888907的博客 525

Java线程池调优实战:从参数配置到压测验证

线程池作为Java并发编程的核心工具,其参数配置直接决定系统吞吐与响应表现。corePoolSize、maximumPoolSize、workQueue与拒绝策略并非孤立取值,而是围绕任务类型、资源边界和延迟目标协同权衡。针对CPU密集与IO密集场景,需结合任务到达速率、单任务耗时及下游消费能力估算初始值,并通过压测验证队列堆积、线程活跃度等关键指标。在日志采集、订单推送、批量调度等高频场景中,合理的线程池调优既能避免任务排队飙升与CPU空转,也能为动态调整与补偿机制提供依据。本文从工程实践出发,拆解一套可

weixin_30086969的博客 346

Spring Boot @Async失效排查:代理自调用与线程池配置

在Spring Boot工程实践中,异步任务常用@Async注解实现解耦与提速,但不少开发者发现异步方法并未按预期在线程池中执行,而是仍然同步运行。究其根因,大多与Spring AOP代理机制有关——同类内部方法自调用时会绕过代理,导致@Async、@Transactional等声明式注解集体失效。理解JDK动态代理与CGLIB代理的区别,掌握代理拦截的基本原理,是定位这类问题的关键。通过拆分独立Bean、注入自身代理或使用AopContext,可以恢复外部拦截链路;而配好线程池、拒绝策略与异常处理器,则是

weixin_32175665的博客 253

Spring Boot注解进阶:定时任务、缓存、异步与事务的避坑指南

Spring Boot注解简化了企业级开发,但默认行为背后的代理机制、线程模型与事务边界,常让线上环境出现难以排查的隐患。理解AOP代理是掌握@Cacheable、@Async、@Transactional等注解的关键——同类自调用、非public方法、异常被吞都会导致注解静默失效。同时,@Scheduled默认单线程调度会造成任务阻塞,缓存Key生成与序列化方式影响命中率与存储成本,事务回滚规则与传播行为则直接关乎数据一致性。合理配置线程池、显式设定缓存TTL与序列化器、明确事务rollbackFor及传

weixin_33805992的博客 416

Java面试核心:从八股文到工程思维的实战能力构建

在Java开发领域,掌握集合框架、并发编程和JVM原理等基础知识是构建稳定应用的核心。理解底层数据结构如数组与链表的差异,以及ConcurrentHashMap的锁分段技术,有助于设计高效的线程安全缓存。从Java内存模型(JMM)到volatile、synchronized等关键字的原理,再到线程池的资源管理哲学,这些知识共同支撑着高并发场景下的系统稳定性。在实际工程中,技术选型需结合具体场景,例如根据缓存规模、并发压力和数据一致性要求,权衡使用ConcurrentHashMap、Guava Cache或

weixin_34344403的博客 375

金九银十Java后端求职:简历优化与并发编程实战指南

在技术岗位竞争日益激烈的环境下,如何让简历在HR的10秒筛选窗口内传递出清晰、可验证的匹配信号,是所有Java后端求职者面临的第一个核心挑战。技术面试已从单纯的知识记忆转向对真实工程问题解决能力的考察。掌握并发编程、MySQL索引优化、Redis缓存一致性等高价值技术点,并具备“结论-原理-场景”的面试表达逻辑,是突破笔试与面试瓶颈的关键。本文从招聘方的筛选逻辑出发,拆解简历优化的具体方法,整理Java后端金九银十复习主线,深度剖析线程池、OOM排查、秒杀防超卖等场景题,并结合AI大模型应用趋势,帮助求职者

weixin_33843409的博客 328

Spring Boot异步编程实战:大文件上传并发瓶颈与分片合并方案

高并发场景下,同步阻塞模型往往成为系统瓶颈,尤其当大文件上传这类耗时操作占据Web容器线程时,轻量请求响应会急剧恶化。异步编程通过将任务提交至独立线程池执行,能够有效解耦耗时操作与请求链路,提升系统吞吐能力。线程池参数设计、任务状态机追踪、异常兜底与优雅停机,是异步体系落地的关键工程实践。结合分片上传与断点续传,可以将文件合并、校验等重操作从同步接口中剥离,再辅以Redis存储实时进度、CompletableFuture承接异步结果,实现可靠且可观测的文件上传链路。针对分片合并失败等场景,通过定时任务补偿与

weixin_33801856的博客 344

慢接口优化实战:从压测到缓存,QPS提升11倍的完整链路

性能优化是后端工程中绕不开的必修课。当接口响应变慢、数据库CPU飙高时,往往不是代码逻辑问题,而是数据链路中的瓶颈在作祟。本文从压测工具选型与目标水位计算出发,介绍如何通过慢SQL索引优化、连接池与线程池调参、代码级N+1修复等手段建立基线。随后引入Redis缓存与Caffeine本地缓存,结合空值缓存与布隆过滤器应对穿透,并利用异步化剥离非核心逻辑。最终单实例QPS从280提升至3200,P99响应时间从1.2s降到90ms。无论你是准备做性能压测,还是想调稳现有服务,这套排查链路与参数配置都能直接复用。

weixin_34268310的博客 271

Spring Boot集成AI生成博客摘要:从接口调通到生产级落地全实践

在构建技术博客时,如何让读者快速判断一篇文章是否值得阅读?AI自动生成摘要是一种高效的解法。本文从开发者的实际需求出发,讲解如何基于Spring Boot生态构建一套稳定、可维护的AI摘要生成链路。文章从基础概念切入,逐步深入到核心技术原理:如何通过Spring AI统一对接大模型API,如何进行文章内容清洗与Prompt模板设计,如何利用异步线程池、缓存和重试机制保障系统在高延迟外部依赖下依然稳定运行,以及如何通过状态机管理摘要的生成、失败和人工覆盖。整个方案不仅适用于博客系统,也可以灵活迁移到内容管理、

weixin_33923762的博客 342
上一篇: es查询遇到的问题
下一篇: [Elasticsearch exception [type=circuit_breaking_exception, reason=[parent] Data too large, data for
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值