Java线程池:当核心线程数为 0 时,任务来了的执行流程

先说结论:创建一个临时线程直接执行

ThreadPoolExecutor.excute()

 public void execute(Runnable command) {
    if (command == null)
        throw new NullPointerException();
    int c = ctl.get();
    if (workerCountOf(c) < corePoolSize) {
        if (addWorker(command, true)) 
            return;
        c = ctl.get();
    }
    
    if (isRunning(c) && workQueue.offer(command)) {
        int recheck = ctl.get();
        if (! isRunning(recheck) && remove(command))
            reject(command);
        
        // 如果没有在工作线程,则尝试添加一个新线程
        else if (workerCountOf(recheck) == 0)
            addWorker(null, false);
    }
    else if (!addWorker(command, false))
        reject(command);
}

在这里插入图片描述

如果核心线程数为 0,那么任务来了,没有核心线程处理,正常策略上来说会进入工作队列排队等待,但是会有一个问题就是,队列不满那就不会有任何的线程来处理这个任务,这是不可取的,所以线程池底层对于这种情况采取特殊的策略

只要核心线程数为 0,那么任务来了就直接创建一个临时线程来执行此任务。

在这里插入图片描述
当有一个(临时)工作线程之后,后续来的任务也是按照正常的策略去工作任务队列排队等待(一切照旧,相当于创建的临时线程当核心线程使)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值