前置条件
项目采用如下线程池
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
中,线程没法从任务中解放出来,从而没法去队列取出新的任务。
所以,后续新任务一直在队列中,没有被真正执行。
解决方案
调大核心线程数