Java 并发库通过 java.util.concurrent.Executors 工厂类提供了多种线程池实现。以下是主要的线程池类型及其区别,并附代码示例:
🧵 1. FixedThreadPool(固定大小线程池)
特点:核心线程数 = 最大线程数,使用无界队列 LinkedBlockingQueue使用场景:已知并发量、需要限制资源使用的场景注意:任务过多可能导致内存溢出
ExecutorService fixedPool = Executors.newFixedThreadPool(3); // 固定3个线程
// 提交任务
IntStream.range(0, 5).forEach(i ->
fixedPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + " 处理任务-" + i);
try { Thread.sleep(1000); } catch (InterruptedException e) {}
})
);
fixedPool.shutdown(); // 关闭线程池
⚡ 2. CachedThreadPool(缓存线程池)
特点:无核心线程,最大线程数=Integer.MAX_VALUE,使用同步队列 SynchronousQueue使用场景:大量短期异步任务注意:可能创建大量线程导致资源耗尽
ExecutorService cachedPool = Executors.newCachedThreadPool();
IntStream.range(0, 100).forEach(i ->
cachedPool.execute(() ->
System.out.println(Thread.currentThread().getName() + " 快速任务-" + i)
)
);
cachedPool.shutdown();
→ 3. SingleThreadExecutor(单线程池)
特点:仅1个工作线程,使用无界队列使用场景:需要保证任务顺序执行的场景
ExecutorService singlePool = Executors.newSingleThreadExecutor();
IntStream.range(0, 5).forEach(i ->
singlePool.execute(() ->
System.out.println("顺序执行任务-" + i)
)
);
singlePool.shutdown();
⏰ 4. ScheduledThreadPool(定时线程池)
特点:支持定时/周期性任务,使用 DelayedWorkQueue使用场景:定时任务、心跳检测等
ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(2);
// 延迟1秒执行
scheduledPool.schedule(() ->
System.out.println("延迟任务"), 1, TimeUnit.SECONDS
);
// 固定频率执行(首次延迟2秒,后续每3秒执行)
scheduledPool.scheduleAtFixedRate(() ->
System.out.println("周期性任务"), 2, 3, TimeUnit.SECONDS
);
// scheduledPool.shutdown(); // 实际使用需关闭
🧩 5. WorkStealingPool(工作窃取线程池)- Java 8+
特点:基于ForkJoinPool实现,使用工作窃取算法使用场景:并行计算、分治任务
ExecutorService workStealingPool = Executors.newWorkStealingPool();
// 提交可分解的任务(如斐波那契计算)
workStealingPool.submit(() -> {
System.out.println("WorkStealing任务: " +
ForkJoinPool.commonPool().getPoolSize());
});
workStealingPool.shutdown();
📊 线程池对比表
线程池类型核心线程数最大线程数队列类型适用场景FixedThreadPool自定义(n)等于核心线程数LinkedBlockingQueue控制资源使用的并发任务CachedThreadPool0Integer.MAX_VALUESynchronousQueue大量短期异步任务SingleThreadPool11LinkedBlockingQueue单线程顺序执行任务ScheduledThreadPool自定义(n)Integer.MAX_VALUEDelayedWorkQueue定时/周期性任务WorkStealingPoolCPU核心数无上限任务窃取队列并行计算/分治任务
🚨 重要注意事项
推荐使用 ThreadPoolExecutor 手动创建线程池,避免使用无界队列(可能引起OOM):
new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60L, TimeUnit.SECONDS, // keepAliveTime
new ArrayBlockingQueue<>(100) // 有界队列
);
使用 ScheduledThreadPool 替代 Timer所有线程池最终都应调用 shutdown() 释放资源使用 Future 处理带返回值的任务:
Future
System.out.println(future.get()); // 阻塞获取结果
💡 最佳实践:根据任务特性选择线程池类型,生产环境建议手动配置线程池参数,并设置拒绝策略(如 RejectedExecutionHandler)保证系统稳定性。