面试题答案
一键面试线程池关键参数及其影响
- 核心线程数(corePoolSize)
- 含义:线程池中常驻的核心线程数。即使这些线程处于空闲状态,也不会被销毁,除非设置了
allowCoreThreadTimeOut
为true
。 - 对性能和行为的影响:如果任务提交速度小于核心线程处理速度,核心线程能快速处理任务,减少任务等待时间。若核心线程数设置过小,面对突发任务时,任务可能会在队列中等待,导致响应延迟;设置过大则会占用过多系统资源。
- 含义:线程池中常驻的核心线程数。即使这些线程处于空闲状态,也不会被销毁,除非设置了
- 最大线程数(maximumPoolSize)
- 含义:线程池中允许存在的最大线程数。当任务队列已满,且核心线程都在忙碌时,线程池会创建新线程,直到线程数达到最大线程数。
- 对性能和行为的影响:若设置过小,可能无法及时处理大量突发任务,导致任务积压;设置过大,则可能过度消耗系统资源,甚至引发系统崩溃,因为每个线程都占用一定的内存等资源。
- 队列容量(workQueue)
- 含义:用于存放等待执行任务的队列。当核心线程都在处理任务时,新任务会被放入此队列。
- 对性能和行为的影响:队列容量影响任务的排队等待情况。若容量过小,任务可能很快填满队列,促使线程池创建更多线程;容量过大,会使任务长时间在队列中等待,占用内存,并且可能导致新提交的任务响应延迟,因为只有核心线程处理完任务,队列中的任务才会被执行。
- 线程存活时间(keepAliveTime)
- 含义:当线程池中的线程数超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。
- 对性能和行为的影响:若设置过短,线程频繁创建和销毁会增加系统开销;设置过长,多余线程长时间不工作却占用资源,浪费系统资源。
- 时间单位(unit)
- 含义:用于指定
keepAliveTime
的时间单位,如TimeUnit.SECONDS
、TimeUnit.MILLISECONDS
等。 - 对性能和行为的影响:与
keepAliveTime
配合,准确控制线程存活时间,不同时间单位会导致线程存活时间的巨大差异,从而影响线程池资源管理。
- 含义:用于指定
- 拒绝策略(RejectedExecutionHandler)
- 含义:当线程池和任务队列都已满,无法再接受新任务时,所采取的处理策略。常见策略有
AbortPolicy
(抛出异常)、CallerRunsPolicy
(在调用者线程中执行任务)、DiscardPolicy
(丢弃任务)、DiscardOldestPolicy
(丢弃队列中最老的任务,然后尝试提交新任务)。 - 对性能和行为的影响:不同策略对系统行为影响不同。
AbortPolicy
可能使系统出现未处理异常;CallerRunsPolicy
可减轻线程池压力,但会影响调用者线程性能;DiscardPolicy
和DiscardOldestPolicy
可能导致任务丢失,需根据业务需求谨慎选择。
- 含义:当线程池和任务队列都已满,无法再接受新任务时,所采取的处理策略。常见策略有
处理大量短连接请求的参数初步设置
- 核心线程数:可根据服务器CPU核心数及每个任务处理的大致负载来设置,一般设置为
CPU核心数 * 2
,这样能充分利用CPU资源,快速处理短连接请求,减少任务等待。 - 最大线程数:考虑到短连接请求特点,可适当比核心线程数增加一些,如设置为
CPU核心数 * 4
。避免过多创建线程造成资源浪费,同时应对突发流量。 - 队列容量:不宜设置过大,防止任务长时间等待,可设置为几百,如
200
,能在一定程度上缓冲任务,又不会让任务等待太久。 - 线程存活时间:由于是短连接请求,线程空闲时间不会太长,可设置较短,如
10秒
,使用TimeUnit.SECONDS
,及时释放多余线程资源。 - 拒绝策略:对于短连接请求,可选择
CallerRunsPolicy
,让调用者线程处理任务,避免任务丢失,同时减轻线程池压力。