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

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

一、判断当前线程状态

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

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

二、判断核心线程数

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

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

三、判断阻塞队列

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

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

四、判断最大线程数

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

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

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

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

五、执行流程总结

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

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

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

相关推荐
xcl092528 分钟前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
吴声子夜歌35 分钟前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
小小猪的春天44 分钟前
Java 手写第一个 MCP Server:Spring AI MCP 半小时跑通
java·人工智能·spring boot·ai编程
find1star44 分钟前
LeetCode 141:环形链表
java·算法·leetcode·链表
今天AI了吗2 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
许彰午2 小时前
27-AuthService登录链路
java·低代码·架构
泡海椒2 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
黄敬峰2 小时前
一文搞懂 LLM 流式输出与 SSE
面试
Rain的Java大神之路3 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
自动化监测Learner3 小时前
Navicat Premium 17 中文版安装教程(2026最新版)
java·linux·数据库