面试官:核心线程数为0时,线程池如何执行?

线程池基础
  • 线程池:Java中用于提升程序执行效率的并发编程技术。
  • 核心线程数 (corePoolSize):线程池中最小线程数,空闲时不销毁。
  • 最大线程数 (maximumPoolSize):线程池允许的最大线程数,等于核心线程数加临时线程数。
线程池执行流程
  1. 核心线程数判断:如果当前工作线程数小于核心线程数,新建线程执行任务。
  2. 任务队列判断:如果工作线程数超过核心线程数但任务队列未满,将任务加入队列。
  3. 最大线程数判断:如果任务队列已满且当前线程数小于最大线程数,新建线程执行任务。
  4. 执行拒绝策略:如果当前线程数达到最大线程数,执行拒绝策略。
核心线程数为0的特殊执行流程
  • 预期行为:任务直接加入队列,不立即执行。
  • 实际行为:任务加入队列后,线程池检查工作线程数,如果为0,会立即创建线程执行任务。
验证代码示例
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
    0, // 核心线程数设置为0
    10, // 最大线程数
    1, TimeUnit.SECONDS, // 线程存活时间
    new ArrayBlockingQueue<>(10) // 任务队列容量
);

threadPoolExecutor.execute(() -> {
    System.out.println("www.javacn.site");
});
  • 结果:任务被立即执行,与预期不符。
源码分析
  • 源码显示,即使核心线程数为0,如果当前工作线程数为0,线程池也会创建线程执行任务。
总结
  • 核心线程数设置为0时,线程池的行为可能出乎预期。

  • 源码分析揭示了线程池在任务到来时,即使核心线程数为0,也会检查当前工作线程数,如果为0,会创建线程执行任务,确保任务得到及时处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值