面试题答案
一键面试创建
- 核心线程:当有新任务提交到线程池时,若当前线程池中的线程数量未达到核心线程数,就会创建新的核心线程来执行任务。即使有空闲的线程,只要线程数未达到核心线程数,仍会优先创建新的核心线程。例如,核心线程数设置为5,开始提交任务时,会依次创建5个核心线程来执行任务。
- 非核心线程:当线程池中的线程数量达到核心线程数后,且任务队列已满,才会创建非核心线程。如核心线程数为5,任务队列容量为10,当提交第16个任务时,若5个核心线程都在忙碌且任务队列已满,此时会创建非核心线程。
存活时间
- 核心线程:默认情况下,核心线程会一直存活,即使它们处于空闲状态,不会被销毁。不过,可以通过调用
allowCoreThreadTimeOut(boolean value)
方法,设置允许核心线程在空闲时间达到keepAliveTime
时被销毁。 - 非核心线程:非核心线程如果在
keepAliveTime
时间内一直处于空闲状态,就会被销毁。例如keepAliveTime
设置为60秒,那么非核心线程空闲60秒后就会被回收。
任务执行
- 核心线程:优先由核心线程执行任务。只要核心线程中有空闲线程,新提交的任务就会分配给空闲的核心线程执行。如核心线程数为3,有3个任务同时提交,这3个任务会分别由3个核心线程执行。
- 非核心线程:当核心线程全部忙碌且任务队列已满时,才会由非核心线程执行新提交的任务。比如核心线程数3,任务队列容量5,当提交第9个任务时,若前8个任务已使3个核心线程忙碌且任务队列满了,第9个任务会由新创建的非核心线程执行 。