还是线程池问题,任务数小于核心线程数和有界队列的容量,为什么会创建普通线程?

刚开始看线程池

我看了好几个帖子,线程池处理任务的顺序都是

1.任务数小于核心线程数的时候,直接创建核心线程执行
2.任务数不小于核心线程数的时候,进队列
3.队列满了,且核心线程都阻塞,才会创建不超过最大线程数的普通线程

img

然后我昨天晚上写了一个小练习

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 5,
                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));

  for (int i = 0, size = 10; i < size; i++) {
            threadPoolExecutor.execute(() -> {
                System.out.println("线程:" + Thread.currentThread().getName() + "正在运行");

            });
        }
        

img

我只遍历添加了10个任务,在我的预想中正好填满核心线程数5+任务队列5

如果按照上面的流程图,到不了添加普通线程的那个条件

但是实际都加到8了

然后昨天晚上的提问,有两个回答我最大线程数的问题,

但是我的想法是,不应该正好填满任务队列吗,怎么会有创建普通线程的机会呢?

然后我把任务数的size 改了6

for (int i = 0, size = 6; i < size; i++) {
            threadPoolExecutor.execute(() -> {
                System.out.println("线程:" + Thread.currentThread().getName() + "正在运行");

            });
        }


img

线程还是创建到了6,有没有懂的能说明一下,

我知道最大线程设为5就不会有了,但是我的疑问是他不应该走到这一步

只有6个任务,五个核心线程,剩一个放队列,队列都空荡荡的,怎么跑去创建普通线程了呢

亲测 jdk1.8 只有5个线程

img

这个可能是环境问题!你可以直接断点下源码,看什么时候进的 addWorker(null, false);