java线程池进阶面试题
时间: 2024-12-09 20:12:05 浏览: 25
好的,我很乐意为您介绍Java线程池的进阶面试题。以下是一些常见的进阶面试题,以及相应的解答:
1. 什么是线程池的核心线程数和最大线程数?它们有什么区别?
核心线程数是线程池中始终保持活跃的线程数量,即使这些线程处于空闲状态。最大线程数是线程池允许创建的最大线程数量。核心线程数用于保持线程池的基本运行能力,而最大线程数用于应对突发的高并发请求。
2. 线程池有哪些拒绝策略?它们分别适用于什么场景?
常见的拒绝策略包括:
- AbortPolicy: 直接抛出异常,默认策略。
- CallerRunsPolicy: 由调用者线程直接执行任务。
- DiscardPolicy: 丢弃新提交的任务。
- DiscardOldestPolicy: 丢弃最早未处理的任务。
不同的拒绝策略适用于不同的场景,如对任务执行要求严格或可以容忍任务丢失等。
3. 如何合理设置线程池的参数?
设置线程池参数需要考虑任务的性质(如IO密集型还是CPU密集型)、系统资源(如CPU核心数)以及任务的提交频率等。通常可以使用公式计算核心线程数和最大线程数,例如:
- CPU密集型任务: 核心线程数 = CPU核心数 + 1
- IO密集型任务: 核心线程数 = CPU核心数 * 2
4. 线程池中的Worker线程是如何工作的?
Worker线程会不断从任务队列中获取任务并执行。当没有任务时,线程会阻塞等待新任务到来。核心线程会一直保持活跃,而非核心线程在空闲一段时间后可能会被回收。
5. 线程池的shutdown和shutdownNow方法有什么区别?
shutdown方法会平滑地关闭线程池,不再接受新任务,但会等待已提交的任务完成。shutdownNow方法会立即停止所有正在执行的任务,并返回等待执行的任务列表。
阅读全文