面试题答案
一键面试FixedThreadPool
- 特点
- 线程池大小固定,创建后线程数量不会改变。
- 任务队列是无界的(LinkedBlockingQueue),这意味着只要有新任务提交,就会被放入队列等待执行,不会因为队列满而拒绝任务(除非线程池被关闭)。
- 核心线程数和最大线程数相等,都是创建线程池时设定的固定值。
- 应用场景
- 适用于对线程数量有严格限制,且任务执行时间相对较长的场景。例如,数据库连接池可以使用FixedThreadPool,因为数据库的连接数通常是有限制的,过多的连接可能导致数据库资源耗尽。使用FixedThreadPool可以保证同时处理的数据库操作数量在合理范围内,避免过多连接对数据库造成压力。
CachedThreadPool
- 特点
- 线程池大小不固定,核心线程数为0,最大线程数为Integer.MAX_VALUE。
- 任务队列是SynchronousQueue,这是一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作,反之亦然。
- 如果线程池中有空闲线程则复用空闲线程,如果没有则创建新线程执行任务。当线程空闲时间超过60秒,该线程会被终止并从线程池中移除。
- 应用场景
- 适合处理大量短时间工作的任务。例如,在Web服务器中处理大量的HTTP请求,这些请求处理时间较短,但数量可能非常多。CachedThreadPool可以快速创建线程来处理这些请求,并且在请求处理完毕后,空闲线程会在一段时间后自动销毁,不会占用过多资源。
SingleThreadExecutor
- 特点
- 线程池中只有一个核心线程,确保所有任务都在同一个线程中按顺序执行。
- 任务队列是无界的(LinkedBlockingQueue)。
- 线程池的大小固定为1,即使这个唯一的线程在执行任务时出现异常,线程池也会创建一个新的线程来替代它继续执行后续任务。
- 应用场景
- 适用于需要按顺序执行任务,并且不希望有多个线程同时执行的场景。例如,在处理文件写入操作时,如果多个线程同时写入可能导致文件内容混乱,使用SingleThreadExecutor可以保证文件写入操作按顺序依次执行,避免数据不一致问题。