Java线程池满了,导致触发了拒绝策略的问题

更新时间:2023-07-05 20:19:41 阅读: 评论:0

Java线程池满了,导致触发了拒绝策略的问题
  ⼀个同事写需求的时候,使⽤了线程池,出了问题,这⾥记录⼀下。
二月二吃什么  ⾸先他的需求是进⾏定时每天统计点击数据申请请求(⼀个接⼝),为了解耦,他使⽤了AOP+注解的⽅式,获取到那个请求的操作,并进⾏统计,不过由于是切⾯操作,只要有⽤户点击这个按钮触发这个请求就会⾛他的切⾯的逻辑,⽽且由于他计算的过程需要调⽤其他服务接⼝(远程调⽤),有⼀定的耗时操作,为了提⾼⽤户体验,他就使⽤了线程执⾏⽅式进⾏异步操作。
  这⾥他使⽤的是wSingleThreadExecutor的⽅式进⾏创建的线程池,这⾥只使⽤了⼀个线程去操作,最终导致了当他测试接⼝的时候,只要他点击稍微快点⼉就会出现异常,异常信息如下所⽰:
RejectedExecutionException: Task SpringDataRecommendAspect$1@46945a4 rejected from ThreadPoolExecutor@77e771ae[Terminated, pool size =0, active threads =0, queued tasks =0, completed tasks =1]
肉的英语怎么读at jectedExecution(ThreadPoolExecutor.java:2063)
ject(ThreadPoolExecutor.java:830)
ute(ThreadPoolExecutor.java:1379)
at ute(Executors.java:668)
  问题分析,这⾥根据我们对线程池的了解,来了任务,如果没有达到核⼼线程数,就会创建线程,如果达到了核⼼线程数,就会进⼊到队列中进⾏等待调⽤,如果队列也满了,那么就会创建线程到最⼤线程数,如果最⼤线程数也满了,仍然有请求过来,那么就会触发默认的拒绝策略,会出现抛出异常。
  解决⽅法是:使⽤了springboot的线程池的创建⽅式,根据需求和业务场景,设置了核⼼线程数5个,队列数500,最⼤线程数10个,并且设置了拒绝策略为DiscardPolicy,即如果都满了,没有任务处理这个请求的话,就放弃这个请求的操作。这⾥业务上是允许的,因为对这个请求的统计不要求精确。
public Executor getExecutor(){
ThreadPoolTaskExecutor executor =new ThreadPoolTaskExecutor();
//配置核⼼线程数
executor.tCorePoolSize(5);
//配置最⼤线程数
改变作文executor.tMaxPoolSize(10);
//配置队列⼤⼩
executor.tQueueCapacity(500);
/
/配置线程池中的线程的名称前缀
executor.tThreadNamePrefix("async-rvice-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务玛卡泡水
// CALLER_RUNS:不在新线程中执⾏任务,⽽是有调⽤者所在的线程来执⾏
executor.tRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); //执⾏初始化
烤蘑菇
8年级executor.initialize();反问句练习
return executor;
眉尾}

本文发布于:2023-07-05 20:19:41,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1080448.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   请求   策略   拒绝   操作
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图