大厂面试真题-简单说说线程池接到新任务之后的操作流程

线程池在接到新任务后的操作流程通常遵循以下步骤,这些步骤确保了任务的高效管理和执行。

一、判断当前线程状态

线程池首先会判断当前是否存在空闲线程,即没有正在执行任务且未被标记为死亡的线程。

  • 有空闲线程:如果存在空闲线程,线程池会直接将新任务分配给该空闲线程执行。
  • 无空闲线程:如果没有空闲线程,线程池则进入下一步的判断流程。

二、判断核心线程数

接下来,线程池会判断当前运行中的线程数是否小于核心线程数(corePoolSize)。

  • 小于核心线程数:如果当前线程数小于核心线程数,线程池会创建一个新的核心线程,并将新任务分配给该线程执行。
  • 大于等于核心线程数:如果当前线程数已达到或超过核心线程数,线程池则不会继续创建核心线程,而是进入下一步的判断流程。

三、判断阻塞队列

当核心线程数已满时,线程池会检查阻塞队列(workQueue)的状态。

  • 队列未满:如果阻塞队列未满,线程池会将新任务添加到阻塞队列中等待执行。一旦有空闲线程出现,线程池会按照先进先出(FIFO)的规则从队列中取出任务并执行。
  • 队列已满:如果阻塞队列已满,线程池则进入下一步的判断流程。

四、判断最大线程数

在阻塞队列已满的情况下,线程池会判断当前线程数是否已达到最大线程数(maximumPoolSize)。

  • 未达到最大线程数:如果当前线程数未达到最大线程数,线程池会创建一个新的非核心线程(也称为临时线程或辅助线程),并将新任务分配给该线程执行。

  • 达到最大线程数:如果当前线程数已达到最大线程数,线程池则无法再创建新的线程来执行任务。此时,线程池会采用拒绝策略(RejectedExecutionHandler)来处理新任务。常见的拒绝策略包括:

    • AbortPolicy:直接抛出异常,这是默认策略。
    • CallerRunsPolicy:由提交任务的线程(即调用者线程)来执行任务。
    • DiscardOldestPolicy:丢弃阻塞队列中最靠前的任务(即最早进入队列但尚未执行的任务),然后执行当前任务。
    • DiscardPolicy:直接丢弃任务,不做任何处理。

五、执行流程总结

综上所述,线程池接到新任务后的操作流程可以总结为以下步骤:

  1. 判断是否存在空闲线程,若存在则分配任务。
  2. 若无空闲线程,则判断当前线程数是否小于核心线程数,若小于则创建核心线程执行任务。
  3. 若核心线程数已满,则检查阻塞队列是否未满,若未满则将任务添加到队列中等待执行。
  4. 若阻塞队列已满,则判断当前线程数是否未达到最大线程数,若未达到则创建非核心线程执行任务。
  5. 若已达到最大线程数,则采用拒绝策略处理新任务。

这个流程确保了线程池能够高效地管理和执行任务,同时避免了资源的过度使用和浪费。

相关推荐
我是唐青枫2 分钟前
Java MyBatis 实战指南:XML 映射、动态 SQL 与数据访问层设计
java·mybatis
摇滚侠4 分钟前
Spring 零基础入门到进阶 面向切面 AOP 52-60
java·后端·spring
就改了13 分钟前
微服务接口性能优化:CompletableFuture 并行聚合实践
java·微服务·性能优化
林森lsjs14 分钟前
【日耕一题】4. 较为复杂情况下的求和
java·开发语言
Hui Baby16 分钟前
虚拟线程整理
java
白露与泡影31 分钟前
2026秋招冲刺:1000道Java高频面试题(各大厂考点汇总)
java·开发语言·面试
IT龟苓膏35 分钟前
Java 并发基础:进程、线程、线程状态、synchronized、volatile 一篇讲清
java·开发语言·jvm
weixin_4467291636 分钟前
java中class类没有打进war包中
java
哭哭啼1 小时前
pgSql 事务篇
java·数据库·postgresql
架构源启1 小时前
Spring AI进阶系列(17)- 未来展望与职业发展:Java 工程师迈向 AI 工程化与智能体架构的路线图
java·人工智能·spring