刚开始看线程池
我看了好几个帖子,线程池处理任务的顺序都是
1.任务数小于核心线程数的时候,直接创建核心线程执行
2.任务数不小于核心线程数的时候,进队列
3.队列满了,且核心线程都阻塞,才会创建不超过最大线程数的普通线程
然后我昨天晚上写了一个小练习
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() + "正在运行");
});
}
我只遍历添加了10个任务,在我的预想中正好填满核心线程数5+任务队列5
如果按照上面的流程图,到不了添加普通线程的那个条件
但是实际都加到8了
然后昨天晚上的提问,有两个回答我最大线程数的问题,
但是我的想法是,不应该正好填满任务队列吗,怎么会有创建普通线程的机会呢?
然后我把任务数的size 改了6
for (int i = 0, size = 6; i < size; i++) {
threadPoolExecutor.execute(() -> {
System.out.println("线程:" + Thread.currentThread().getName() + "正在运行");
});
}
线程还是创建到了6,有没有懂的能说明一下,
我知道最大线程设为5就不会有了,但是我的疑问是他不应该走到这一步
只有6个任务,五个核心线程,剩一个放队列,队列都空荡荡的,怎么跑去创建普通线程了呢