chuliyongcan 2021-07-23 09:58 采纳率: 66.7%
浏览 111
已结题

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

刚开始看线程池

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

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个任务,五个核心线程,剩一个放队列,队列都空荡荡的,怎么跑去创建普通线程了呢

  • 写回答

2条回答 默认 最新

  • a1767028198 2021-07-23 10:17
    关注

    亲测 jdk1.8 只有5个线程

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月31日
  • 已采纳回答 7月23日
  • 创建了问题 7月23日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助