MST

星途 面试题库

面试题:Java中线程池ThreadPoolExecutor的常见参数及作用

请详细说明Java线程池ThreadPoolExecutor构造函数中corePoolSize、maximumPoolSize、keepAliveTime、unit和workQueue这几个参数的含义及它们是如何相互协作来管理线程池的?
20.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

corePoolSize

  • 含义:线程池中核心线程数的大小。核心线程是指在没有任务执行时也不会被销毁的线程,除非设置了 allowCoreThreadTimeOuttrue
  • 作用:当有新任务提交到线程池时,如果当前线程数小于 corePoolSize,线程池会创建新的线程来执行任务,即使此时有其他空闲的核心线程。

maximumPoolSize

  • 含义:线程池中允许的最大线程数。当线程池中的任务数量不断增加,并且 workQueue 已满时,线程池会继续创建新的线程,直到线程数达到 maximumPoolSize
  • 作用:它限制了线程池能够创建的线程数量上限,防止线程无限制创建导致系统资源耗尽。

keepAliveTime

  • 含义:当线程池中的线程数量超过 corePoolSize 时,多余的空闲线程的存活时间。即这些空闲线程在多长时间内没有任务执行就会被销毁。
  • 作用:通过设置合适的存活时间,可以在系统负载降低时减少线程池中的线程数量,释放系统资源。

unit

  • 含义keepAliveTime 的时间单位,它是 TimeUnit 枚举类型的一个实例,如 TimeUnit.SECONDS(秒)、TimeUnit.MILLISECONDS(毫秒)等。
  • 作用:明确 keepAliveTime 的时间度量标准,使得时间设置更清晰准确。

workQueue

  • 含义:用于存储等待执行任务的阻塞队列。当线程池中的线程都在忙碌,且当前线程数小于 maximumPoolSize 时,新提交的任务会被放入这个队列中等待执行。
  • 作用:它作为任务的缓冲区域,避免了线程频繁创建和销毁。常见的队列类型有 ArrayBlockingQueue(有界队列)、LinkedBlockingQueue(可设置有界或无界)、SynchronousQueue(不存储任务,直接交给线程处理)等,不同的队列类型对线程池的性能和行为有不同影响。

相互协作

  1. 任务提交:当新任务提交到线程池时,线程池首先检查当前线程数是否小于 corePoolSize。如果是,则创建新的核心线程来执行任务。
  2. 队列缓冲:如果当前线程数已经达到 corePoolSize,则将任务放入 workQueue 中等待。如果 workQueue 有空间,任务会被顺利放入队列。
  3. 最大线程数扩展:如果 workQueue 已满,且当前线程数小于 maximumPoolSize,线程池会创建新的非核心线程来执行任务。
  4. 拒绝策略:如果 workQueue 已满且当前线程数达到了 maximumPoolSize,线程池会根据设置的拒绝策略(如 AbortPolicy 直接抛出异常、CallerRunsPolicy 由调用者线程执行任务等)来处理新提交的任务。
  5. 线程回收:当线程池中的线程数量超过 corePoolSize,且这些多余的线程空闲时间达到 keepAliveTime 时,这些线程会被销毁,直到线程池中的线程数量回到 corePoolSize(除非设置了 allowCoreThreadTimeOuttrue,此时核心线程也会在空闲 keepAliveTime 时间后被销毁)。