工作问题总结

一、异步线程影响了主线程的执行

      1、背景       

        在主线程执行的业务逻辑之外需要通过异步线程执行一些其他业务,异步线程通过线程池进行执行,异步线程的执行不能影响主线程的运行。

        在压测过程中是发现服务报错。

      2、问题定位

        1、查看日志:查看日志发现所有的异常,都是异步线程执行的异常,判断是异步线程影响了主线程的执行。

        2、查看对应的代码,发现整体代码逻辑没有问题,所以可能是线程池的问题。

        3、查看线程池对应配置,发现线程池对拒绝任务的处理方式为CallerRunsPolicy(交给调用线程来执行,理解为主线程进行执行),判断原因是异步线程执行异常,导致线程池队列满了,之后的异步线程改为了主线程执行。

        3、问题复现 

        1、修改线程池配置,将核心线程数、最大线程数和队列最大长度改为1。

        2、修改拒绝策略,直接丢弃(DiscardPolicy)、丢弃队列中最老的任务(DiscardOldestPolicy)。

        3、通过JMete进行压测,查看是否出现同样问题。

         4、线程池配置举例

1、xml中配置线程池ThreadPoolExecutor:
   <bean id="linkQueue" class="java.util.concurrent.LinkedBlockingQueue">
       <constructor-arg name="capacity" value="${thread.pool.linkQueue.size}"/>
   </bean>
   <bean id="pool" class="java.util.concurrent.ThreadPoolExecutor">
       <constructor-arg name="corePoolSize" value="${thread.pool.core.size}"/>
       <constructor-arg name="maximumPoolSize" value="${thread.pool.max.size}"/>
       <constructor-arg name="keepAliveTime" value="${thread.pool.keep.alive.time}"/>
       <constructor-arg name="unit" value="${thread.pool.time.unit}"/>
       <constructor-arg name="workQueue" ref="linkQueue"/>
   </bean>

2、properties文件中配置如下:
#线程池相关配置
#LinkedBlockingQueue队列容量
thread.pool.linkQueue.size=10
#线程池核心线程数
thread.pool.core.size=5
#线程池最大线程数
thread.pool.max.size=10
#空闲线程最大存活时间
thread.pool.keep.alive.time=2
/#时间单位 SECONDS(秒) MILLISECONDS(毫秒) MICROSECONDS(微秒)
thread.pool.time.unit=SECONDS

3.java代码:
public class SaveEventAdviceHolder {

    @Autowired
    private ThreadPoolExecutor pool;

    public void saveSerializeObjEvent(Object[] objects,SaveEventBO bo){
        //设置线程池的异常策略为CallerRunsPolicy()
        RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
        pool.setRejectedExecutionHandler(handler);
        pool.execute(new Runnable() {
            public void run() {
               //线程具体执行任务.....

        });
    }
 }

        5、解决思路 

        1、适当的修改线程池中核心线程数、最大线程数、队列最大长度。

        2、修改线程池拒绝策略,可以自定义。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

!春明!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值