面试题答案
一键面试核心线程
- 任务队列不满时:
- 核心线程会优先处理新提交的任务。只要有新任务提交到线程池,核心线程会在任务队列中的任务之前处理该任务,即使此时线程池中有空闲的核心线程,也不会等待任务队列中的任务,而是直接处理新提交的任务。
- 任务队列满时:
- 若线程池中的线程数量未达到最大线程数,会创建新的非核心线程来处理任务。核心线程不会因为任务队列满就被销毁,始终保持存活(除非设置了允许核心线程超时),持续处理任务。
- 重复利用机制:
- 核心线程在线程池生命周期内通常会一直存活,除非设置了
allowCoreThreadTimeOut(true)
,即允许核心线程在空闲时间达到keepAliveTime
后被销毁。在默认情况下,核心线程处理完任务后会回到线程池中等待下一个任务,持续复用。
- 核心线程在线程池生命周期内通常会一直存活,除非设置了
非核心线程
- 任务队列不满时:
- 若有空闲的核心线程,非核心线程不会被创建。只有当核心线程都在忙碌且任务队列满了之后,才会创建非核心线程来处理任务。
- 任务队列满时:
- 只要线程池中的线程数量未达到最大线程数,就会创建非核心线程来处理任务。但非核心线程在处理完任务后,如果空闲时间超过
keepAliveTime
,就会被销毁,不会像核心线程一样一直存活等待任务。
- 只要线程池中的线程数量未达到最大线程数,就会创建非核心线程来处理任务。但非核心线程在处理完任务后,如果空闲时间超过
- 重复利用机制:
- 非核心线程在空闲时间超过
keepAliveTime
后会被回收,不像核心线程默认一直存活复用。这意味着非核心线程的复用是有时间限制的,在超出keepAliveTime
这段空闲时间后,下次再有任务需要处理时,可能就需要重新创建新的非核心线程。
- 非核心线程在空闲时间超过