面试题答案
一键面试corePoolSize
:- 含义:线程池中核心线程数的大小。核心线程会一直存活,即使它们处于闲置状态,除非设置了
allowCoreThreadTimeOut
为true
。 - 作用:当新任务提交到线程池时,如果当前线程数小于
corePoolSize
,线程池会创建新的核心线程来执行任务,而不是将任务放入队列。
- 含义:线程池中核心线程数的大小。核心线程会一直存活,即使它们处于闲置状态,除非设置了
maximumPoolSize
:- 含义:线程池中允许的最大线程数。当任务队列已满且当前线程数小于
maximumPoolSize
时,线程池会创建新的非核心线程来执行任务。 - 作用:限制线程池能够创建的最大线程数量,防止资源过度消耗。
- 含义:线程池中允许的最大线程数。当任务队列已满且当前线程数小于
keepAliveTime
:- 含义:当线程数大于
corePoolSize
时,多余的非核心线程如果空闲时间超过keepAliveTime
,就会被终止。 - 作用:控制非核心线程的存活时间,当系统负载降低时,通过回收多余的非核心线程来减少资源消耗。
- 含义:当线程数大于
unit
:- 含义:
keepAliveTime
的时间单位,它是TimeUnit
枚举类型的一个实例,例如TimeUnit.SECONDS
、TimeUnit.MILLISECONDS
等。 - 作用:明确
keepAliveTime
的时间度量,以便准确控制线程的存活时间。
- 含义:
workQueue
:- 含义:用于存储等待执行任务的阻塞队列。当线程池中的线程数达到
corePoolSize
时,新提交的任务会被放入这个队列中等待执行。 - 作用:缓冲任务,避免立即创建过多的线程。常见的队列类型有
ArrayBlockingQueue
(有界队列)、LinkedBlockingQueue
(无界队列,默认使用该队列时maximumPoolSize
将不起作用)、SynchronousQueue
(不存储任务,直接将任务交给线程处理,如果没有空闲线程则创建新线程)等。
- 含义:用于存储等待执行任务的阻塞队列。当线程池中的线程数达到
它们的协作方式
- 当一个新任务提交到线程池时,线程池首先会检查当前运行的线程数是否小于
corePoolSize
。如果小于,就创建一个新的核心线程来执行这个任务。 - 如果当前运行的线程数已经达到
corePoolSize
,那么任务会被放入workQueue
中等待执行。 - 如果
workQueue
已满,且当前运行的线程数小于maximumPoolSize
,线程池会创建新的非核心线程来执行任务。 - 当线程数大于
corePoolSize
,且某些非核心线程的空闲时间超过keepAliveTime
时,这些多余的非核心线程会被终止,直到线程数减少到corePoolSize
(除非设置了allowCoreThreadTimeOut
为true
,此时核心线程也可能被终止)。这样通过这些参数的协作,可以根据任务负载动态调整线程池中的线程数量,高效利用资源并保证任务的执行。