MST
星途 面试题库

面试题:Java线程池ThreadPoolExecutor的任务执行流程

详细描述当向Java的ThreadPoolExecutor提交一个任务时,其内部是如何处理该任务的?包括任务在不同线程池状态及不同线程数量情况下的执行路径。
42.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 线程池状态
    • RUNNING:线程池处于正常运行状态,能够接受新任务并处理队列中的任务。
    • SHUTDOWN:线程池不再接受新任务,但会继续处理队列中已有的任务。
    • STOP:线程池不再接受新任务,并且会中断正在执行的任务,同时清空任务队列。
    • TIDYING:所有任务都已终止,工作线程数为0,即将进入TERMINATED状态。
    • TERMINATED:线程池已完全终止。
  2. 任务提交处理流程
    • 当调用ThreadPoolExecutorexecute(Runnable task)方法提交任务时:
      • 步骤1:判断线程池状态
        • 如果线程池状态不是RUNNING,任务将被拒绝(根据拒绝策略处理,如抛出异常、将任务回退到调用者等)。
      • 步骤2:判断工作线程数
        • 如果当前工作线程数小于核心线程数(corePoolSize),则创建一个新的工作线程来执行该任务。
      • 步骤3:判断任务队列
        • 如果当前工作线程数大于或等于核心线程数,且任务队列(workQueue)未满,则将任务添加到任务队列中等待执行。
      • 步骤4:判断线程池是否已满
        • 如果当前工作线程数大于或等于核心线程数,且任务队列已满,同时工作线程数小于最大线程数(maximumPoolSize),则创建一个新的非核心工作线程来执行该任务。
      • 步骤5:拒绝任务
        • 如果当前工作线程数大于或等于核心线程数,任务队列已满,且工作线程数达到最大线程数,那么根据设置的拒绝策略来处理该任务。常见的拒绝策略有:
          • AbortPolicy:直接抛出RejectedExecutionException异常。
          • CallerRunsPolicy:将任务回退给调用者,由调用者线程来执行该任务。
          • DiscardPolicy:直接丢弃该任务,不做任何处理。
          • DiscardOldestPolicy:丢弃任务队列中最老的任务,然后尝试将新任务添加到任务队列。
  3. 不同线程池状态下任务的处理
    • RUNNING状态:正常按照上述步骤1 - 5处理任务。
    • SHUTDOWN状态:不接受新任务,步骤1中任务被拒绝。但会继续处理任务队列中的任务,直到队列为空,并且所有工作线程执行完任务后终止。
    • STOP状态:不接受新任务,步骤1中任务被拒绝。正在执行的任务会被中断,任务队列会被清空,所有工作线程会被中断。
    • TIDYING状态:不接受新任务,任务被拒绝。此时所有任务已完成,等待进入TERMINATED状态。
    • TERMINATED状态:不接受新任务,任务被拒绝。线程池已完全终止,所有资源已释放。