面试题答案
一键面试核心线程数的作用
- 常驻线程:核心线程数指的是线程池中会一直存活的线程数量,即使这些线程处于空闲状态,也不会被销毁。这些线程就像线程池的“核心成员”,随时准备接受新任务并执行。例如,一个Web服务器的线程池,核心线程数可以设置为处理常见请求量的线程数量,始终保持运行,避免频繁创建和销毁线程带来的开销。
- 优先使用:当有新任务提交到线程池时,线程池会优先创建核心线程来执行任务,直到核心线程数达到设定值。
最大线程数的作用
- 应对突发任务:最大线程数规定了线程池中允许存在的最大线程数量。当任务数量超过核心线程数且任务队列已满时,线程池会继续创建新的线程,直到线程总数达到最大线程数。这使得线程池能够在短时间内处理大量突发的任务。例如,在电商促销活动期间,大量用户同时访问网站产生大量请求,线程池可以通过增加线程数量(不超过最大线程数)来尽量快速处理这些请求。
- 资源限制:它也起到了对系统资源的一种限制作用,防止线程无限制创建而耗尽系统资源,如内存等。
两者关系
核心线程数是线程池一开始就会创建并保持存活的线程数量,而最大线程数是线程池能够扩展到的最大线程数量,即核心线程数 ≤ 最大线程数。核心线程数是线程池处理任务的基础,最大线程数则为线程池应对突发流量提供了弹性扩展的能力。
对线程池行为的影响
- 任务提交初期:当任务提交到线程池时,如果当前线程数小于核心线程数,线程池会立即创建新的核心线程来处理任务。例如,线程池初始核心线程数为5,此时提交了3个任务,就会创建3个核心线程分别处理这3个任务。
- 核心线程已满且任务队列未满:如果核心线程数已满,而任务队列尚未达到上限,新提交的任务会被放入任务队列等待核心线程空闲后处理。例如,核心线程数为5,提交了8个任务,前5个任务由核心线程处理,后3个任务会被放入任务队列。
- 核心线程和任务队列都已满:当核心线程数已满且任务队列也满了,此时若还有新任务提交,线程池会创建新的线程(非核心线程)来处理任务,直到线程总数达到最大线程数。若达到最大线程数后还有新任务提交,则根据线程池的拒绝策略来处理这些任务,常见的拒绝策略有直接抛出异常、丢弃任务、丢弃最老的任务、使用调用者线程处理任务等。例如,核心线程数为5,任务队列容量为3,最大线程数为10,当提交10个任务时,前5个由核心线程处理,接着3个放入任务队列,最后2个任务会创建新的非核心线程处理;若再提交任务,就会触发拒绝策略。