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

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

一、判断当前线程状态

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

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

二、判断核心线程数

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

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

三、判断阻塞队列

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

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

四、判断最大线程数

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

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

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

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

五、执行流程总结

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

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

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

相关推荐
aloha_78912 分钟前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java42 分钟前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~1 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
程序媛小果1 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
小屁孩大帅-杨一凡2 小时前
java后端请求想接收多个对象入参的数据
java·开发语言
java1234_小锋2 小时前
使用 RabbitMQ 有什么好处?
java·开发语言
TangKenny2 小时前
计算网络信号
java·算法·华为
肘击鸣的百k路2 小时前
Java 代理模式详解
java·开发语言·代理模式
城南vision2 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wyh要好好学习2 小时前
SpringMVC快速上手
java·spring