java线程池的核心线程数过少引发的血案

前置条件

项目采用如下线程池

   private static final ExecutorService CACHED_THREAD_POOL 
   = 
   new ThreadPoolExecutor(4, 40, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(1024), NAMED_THREAD_FACTORY, new AbortPolicy());

其中核心线程数为4,最大线程数为40。

往线程池提交任务的逻辑如下

  ThreadPool.execute(()->{
        	//只要线程不中断,就一直死循环
            while (!Thread.currentThread().isInterrupted()) {
             		//业务逻辑省略
             		
            }
      });

提交一个任务后,只要运行当前任务的线程没有被中断,线程就在while中一直处理任务的业务逻辑。

问题场景

1.往线程池提交4个任务,发现此时没有问题——业务逻辑都得到了正确的处理,;
2.如果提交超过4个以上的任务,此时出现了问题——后续的任务的业务一直没有被处理。

问题原因

问题排查过程比较艰辛,加了很多锚点日志才最终发现问题的原因,这个过程就不详细介绍了,下面直接说原因。

当提交4个任务后,线程池核心线程数达到了4个。
如果再提交新任务,新任务将被放入队列等待执行。
但是,4个核心线程所处理的任务一直在在while中,线程没法从任务中解放出来,从而没法去队列取出新的任务。
所以,后续新任务一直在队列中,没有被真正执行。

解决方案

调大核心线程数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值