面试题答案
一键面试在Java的可缓存线程池中,核心参数主要通过ThreadPoolExecutor
来体现,虽然可缓存线程池使用Executors.newCachedThreadPool()
创建,本质也是基于ThreadPoolExecutor
。以下是相关核心参数及其对线程池工作机制的影响:
corePoolSize
- 含义:核心线程数,线程池中会一直存活的线程数量,即使这些线程处于空闲状态。
- 影响:在可缓存线程池中,
corePoolSize
被设置为0。这意味着线程池默认情况下没有常驻的核心线程。当有任务提交时,线程池才会创建新线程去执行任务。
maximumPoolSize
- 含义:线程池中允许存在的最大线程数。
- 影响:在可缓存线程池中,
maximumPoolSize
被设置为Integer.MAX_VALUE
,理论上可以创建无限多个线程。当任务数量剧增,现有线程不够用时,线程池会不断创建新线程直至达到该最大值,以应对任务处理需求。
keepAliveTime
- 含义:当线程池中的线程数量超过
corePoolSize
时,多余的空闲线程的存活时间。即这些空闲线程在多长时间后会被销毁。 - 影响:在可缓存线程池中,
keepAliveTime
默认设置为60秒。这意味着如果一个线程从任务执行完毕后,在60秒内没有新任务分配给它,该线程就会被销毁回收,从而实现线程池根据任务量动态调整线程数量。
- 含义:当线程池中的线程数量超过
TimeUnit
- 含义:
keepAliveTime
的时间单位。 - 影响:与
keepAliveTime
配合使用,明确keepAliveTime
的时间尺度,如秒(TimeUnit.SECONDS
)、毫秒(TimeUnit.MILLISECONDS
)等 。在可缓存线程池中默认是TimeUnit.SECONDS
,即keepAliveTime
为60秒。
- 含义:
workQueue
- 含义:用于存放待执行任务的阻塞队列。
- 影响:在可缓存线程池中,使用的是
SynchronousQueue
。SynchronousQueue
没有容量,它不存储任务,每个插入操作必须等待另一个线程的移除操作,反之亦然。这使得当有新任务到来时,如果没有空闲线程,就会立即创建新线程来处理任务,而不是将任务放入队列等待现有线程处理,体现了可缓存线程池快速响应任务的特点。