MST

星途 面试题库

面试题:Java线程池的工作原理及核心参数

请阐述Java线程池中核心线程数、最大线程数、队列容量这几个核心参数的作用,以及它们之间是如何相互配合来处理任务的。
42.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

核心线程数

  • 作用:线程池会维护一定数量的核心线程,这些线程即使在空闲状态下也不会被销毁(除非设置了allowCoreThreadTimeOut为true)。核心线程数定义了线程池能够维持的最小活跃线程数量,它是线程池处理任务的基本力量。
  • 举例:假设核心线程数设置为5,那么线程池初始化后就会创建5个线程,随时准备处理任务。

最大线程数

  • 作用:线程池允许创建的最大线程数量。当任务队列已满且核心线程都在忙碌时,线程池会尝试创建新的线程,直到达到最大线程数。如果此时任务队列已满且线程数已达到最大线程数,那么根据饱和策略来处理新任务。
  • 举例:若最大线程数为10,核心线程数为5,当任务量超过核心线程处理能力且队列已满时,线程池会继续创建线程,最多创建到10个线程来处理任务。

队列容量

  • 作用:用于存放暂时无法被核心线程处理的任务。当核心线程都在执行任务时,新提交的任务会被放入队列中等待处理。队列的容量决定了它能够容纳任务的数量上限。
  • 举例:若队列容量为100,当核心线程忙碌时,新任务最多可以在队列中排队100个,超过这个数量就会根据线程池的策略处理。

相互配合处理任务流程

  1. 任务提交:当有新任务提交到线程池时,首先会检查核心线程是否都在忙碌。
  2. 核心线程处理:如果有核心线程空闲,则直接将任务分配给空闲的核心线程执行。
  3. 队列存放:若核心线程都在忙碌,任务会被放入任务队列中等待。只要队列还有空间,任务就会一直存放在队列里。
  4. 创建新线程:当任务队列已满,且核心线程都在忙碌时,线程池会尝试创建新的线程(只要线程数量未达到最大线程数)来处理任务。
  5. 饱和策略:如果任务队列已满且线程数达到最大线程数,此时再有新任务提交,就会按照预先设定的饱和策略进行处理。常见的饱和策略有AbortPolicy(抛出异常)、CallerRunsPolicy(在调用者线程中执行任务)、DiscardPolicy(丢弃任务)、DiscardOldestPolicy(丢弃队列中最老的任务,然后尝试提交新任务)。