请说明Java并发库中提供了哪些线程池实现,并阐述它们之间的区别。
考察说明
考查对Java并发库中线程池实现的掌握程度,以及能否清晰阐述不同线程池的行为差异和适用场景。
回答思路
- 【回答框架 1】Java通过Executors工厂类提供多种线程池实现,核心都是ThreadPoolExecutor的封装,但各自规定了不同的核心线程数、最大线程数、队列策略和拒绝策略。常见实现包括FixedThreadPool、CachedThreadPool、SingleThreadExecutor和ScheduledThreadPool。
- 【回答框架 2】FixedThreadPool使用固定数量的线程,核心线程数等于最大线程数,且使用无界LinkedBlockingQueue,因此线程数量固定,任务会在队列中等待,适合负载稳定的场景。CachedThreadPool核心线程数为0,最大线程数为Integer.MAX_VALUE,使用SynchronousQueue,一旦有任务就会创建新线程,空闲线程60秒后回收,适合大量短期异步任务,但可能创建过多线程导致资源耗尽。
- 【回答框架 3】SingleThreadExecutor核心线程数和最大线程数均为1,使用无界队列,保证任务按顺序执行,适合需要串行执行的场景。ScheduledThreadPool支持定时和周期性任务,基于DelayedWorkQueue,核心线程数可配置,最大线程数通常无限制,适合需要延迟或周期执行的任务。
- 【回答框架 4】这些实现的核心区别在于线程数量变化策略、工作队列类型以及任务调度方式。此外,Java还提供了ThreadPoolExecutor直接构造,允许自定义参数,如拒绝策略、线程工厂等,以满足更精细的控制需求。在实际应用中,应根据任务类型(CPU密集、IO密集、定时任务)和资源约束选择合适的线程池。
- 【关键点 1】Executors提供FixedThreadPool、CachedThreadPool、SingleThreadExecutor和ScheduledThreadPool四种常见实现。
- 【关键点 2】FixedThreadPool线程数固定,适合负载稳定;CachedThreadPool线程数动态变化,适合短期任务。
- 【关键点 3】SingleThreadExecutor保证任务顺序执行;ScheduledThreadPool支持定时周期执行。
- 【关键点 4】各实现本质上是ThreadPoolExecutor的不同参数配置。
- 【易错点 1】CachedThreadPool可能创建过多线程导致内存或资源耗尽,不适用于长任务。
- 【易错点 2】FixedThreadPool使用无界队列,任务过多时可能积压,导致内存溢出。
- 【易错点 3】ScheduledThreadPool的定时任务若执行时间超过周期,可能造成任务堆积。