MST

星途 面试题库

面试题:Java线程池中核心线程和非核心线程在重复利用机制上有何不同

请阐述在Java线程池中,核心线程和非核心线程在重复利用机制上具体有哪些差异,比如在任务队列满与不满等不同场景下的表现。
16.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

核心线程

  1. 任务队列不满时
    • 核心线程会优先处理新提交的任务。只要有新任务提交到线程池,核心线程会在任务队列中的任务之前处理该任务,即使此时线程池中有空闲的核心线程,也不会等待任务队列中的任务,而是直接处理新提交的任务。
  2. 任务队列满时
    • 若线程池中的线程数量未达到最大线程数,会创建新的非核心线程来处理任务。核心线程不会因为任务队列满就被销毁,始终保持存活(除非设置了允许核心线程超时),持续处理任务。
  3. 重复利用机制
    • 核心线程在线程池生命周期内通常会一直存活,除非设置了allowCoreThreadTimeOut(true),即允许核心线程在空闲时间达到keepAliveTime后被销毁。在默认情况下,核心线程处理完任务后会回到线程池中等待下一个任务,持续复用。

非核心线程

  1. 任务队列不满时
    • 若有空闲的核心线程,非核心线程不会被创建。只有当核心线程都在忙碌且任务队列满了之后,才会创建非核心线程来处理任务。
  2. 任务队列满时
    • 只要线程池中的线程数量未达到最大线程数,就会创建非核心线程来处理任务。但非核心线程在处理完任务后,如果空闲时间超过keepAliveTime,就会被销毁,不会像核心线程一样一直存活等待任务。
  3. 重复利用机制
    • 非核心线程在空闲时间超过keepAliveTime后会被回收,不像核心线程默认一直存活复用。这意味着非核心线程的复用是有时间限制的,在超出keepAliveTime这段空闲时间后,下次再有任务需要处理时,可能就需要重新创建新的非核心线程。