面试题答案
一键面试corePoolSize
- 含义:线程池中核心线程数的大小。核心线程是指在没有任务执行时也不会被销毁的线程,除非设置了
allowCoreThreadTimeOut
为true
。 - 作用:当有新任务提交到线程池时,如果当前线程数小于
corePoolSize
,线程池会创建新的线程来执行任务,即使此时有其他空闲的核心线程。
maximumPoolSize
- 含义:线程池中允许的最大线程数。当线程池中的任务数量不断增加,并且
workQueue
已满时,线程池会继续创建新的线程,直到线程数达到maximumPoolSize
。 - 作用:它限制了线程池能够创建的线程数量上限,防止线程无限制创建导致系统资源耗尽。
keepAliveTime
- 含义:当线程池中的线程数量超过
corePoolSize
时,多余的空闲线程的存活时间。即这些空闲线程在多长时间内没有任务执行就会被销毁。 - 作用:通过设置合适的存活时间,可以在系统负载降低时减少线程池中的线程数量,释放系统资源。
unit
- 含义:
keepAliveTime
的时间单位,它是TimeUnit
枚举类型的一个实例,如TimeUnit.SECONDS
(秒)、TimeUnit.MILLISECONDS
(毫秒)等。 - 作用:明确
keepAliveTime
的时间度量标准,使得时间设置更清晰准确。
workQueue
- 含义:用于存储等待执行任务的阻塞队列。当线程池中的线程都在忙碌,且当前线程数小于
maximumPoolSize
时,新提交的任务会被放入这个队列中等待执行。 - 作用:它作为任务的缓冲区域,避免了线程频繁创建和销毁。常见的队列类型有
ArrayBlockingQueue
(有界队列)、LinkedBlockingQueue
(可设置有界或无界)、SynchronousQueue
(不存储任务,直接交给线程处理)等,不同的队列类型对线程池的性能和行为有不同影响。
相互协作
- 任务提交:当新任务提交到线程池时,线程池首先检查当前线程数是否小于
corePoolSize
。如果是,则创建新的核心线程来执行任务。 - 队列缓冲:如果当前线程数已经达到
corePoolSize
,则将任务放入workQueue
中等待。如果workQueue
有空间,任务会被顺利放入队列。 - 最大线程数扩展:如果
workQueue
已满,且当前线程数小于maximumPoolSize
,线程池会创建新的非核心线程来执行任务。 - 拒绝策略:如果
workQueue
已满且当前线程数达到了maximumPoolSize
,线程池会根据设置的拒绝策略(如AbortPolicy
直接抛出异常、CallerRunsPolicy
由调用者线程执行任务等)来处理新提交的任务。 - 线程回收:当线程池中的线程数量超过
corePoolSize
,且这些多余的线程空闲时间达到keepAliveTime
时,这些线程会被销毁,直到线程池中的线程数量回到corePoolSize
(除非设置了allowCoreThreadTimeOut
为true
,此时核心线程也会在空闲keepAliveTime
时间后被销毁)。