面试题答案
一键面试核心线程数
- 作用:线程池会维护一定数量的核心线程,这些线程即使在空闲状态下也不会被销毁(除非设置了allowCoreThreadTimeOut为true)。核心线程数定义了线程池能够维持的最小活跃线程数量,它是线程池处理任务的基本力量。
- 举例:假设核心线程数设置为5,那么线程池初始化后就会创建5个线程,随时准备处理任务。
最大线程数
- 作用:线程池允许创建的最大线程数量。当任务队列已满且核心线程都在忙碌时,线程池会尝试创建新的线程,直到达到最大线程数。如果此时任务队列已满且线程数已达到最大线程数,那么根据饱和策略来处理新任务。
- 举例:若最大线程数为10,核心线程数为5,当任务量超过核心线程处理能力且队列已满时,线程池会继续创建线程,最多创建到10个线程来处理任务。
队列容量
- 作用:用于存放暂时无法被核心线程处理的任务。当核心线程都在执行任务时,新提交的任务会被放入队列中等待处理。队列的容量决定了它能够容纳任务的数量上限。
- 举例:若队列容量为100,当核心线程忙碌时,新任务最多可以在队列中排队100个,超过这个数量就会根据线程池的策略处理。
相互配合处理任务流程
- 任务提交:当有新任务提交到线程池时,首先会检查核心线程是否都在忙碌。
- 核心线程处理:如果有核心线程空闲,则直接将任务分配给空闲的核心线程执行。
- 队列存放:若核心线程都在忙碌,任务会被放入任务队列中等待。只要队列还有空间,任务就会一直存放在队列里。
- 创建新线程:当任务队列已满,且核心线程都在忙碌时,线程池会尝试创建新的线程(只要线程数量未达到最大线程数)来处理任务。
- 饱和策略:如果任务队列已满且线程数达到最大线程数,此时再有新任务提交,就会按照预先设定的饱和策略进行处理。常见的饱和策略有AbortPolicy(抛出异常)、CallerRunsPolicy(在调用者线程中执行任务)、DiscardPolicy(丢弃任务)、DiscardOldestPolicy(丢弃队列中最老的任务,然后尝试提交新任务)。