在 Java 开发中,线程池是一种有效管理线程资源的技术,通过复用已创建的线程来降低线程创建和销毁的开销,提高系统性能,合理使用线程池能够避免频繁创建线程导致的资源耗尽问题,同时更好地控制并发线程数量,本文将详细介绍 Java 中创建线程池的多种方式及核心参数配置。

通过 ThreadPoolExecutor 创建线程池
Java 提供了 ThreadPoolExecutor 类作为线程池的核心实现,它提供了丰富的参数配置,能够灵活满足不同场景需求,创建线程池时需关注以下核心参数:
- corePoolSize:核心线程数,线程池长期保持的线程数量,即使处于空闲状态也不会被回收。
- maximumPoolSize:最大线程数,线程池允许创建的最大线程数量,当任务队列满了且核心线程数不足时,会继续创建线程直到达到该值。
- keepAliveTime:线程空闲时间,超过该时间的非核心线程会被回收。
- unit:空闲时间的单位,如
TimeUnit.SECONDS、TimeUnit.MILLISECONDS等。 - workQueue:任务队列,用于存储等待执行的任务,常用类型包括
ArrayBlockingQueue(有界队列)、LinkedBlockingQueue(无界队列)和SynchronousQueue(同步队列)。 - threadFactory:线程工厂,用于创建新线程,可自定义线程名称、优先级等属性。
- handler:拒绝策略,当线程数和队列都满时,对新任务的处理方式,如
AbortPolicy(默认,抛出异常)、CallerRunsPolicy(由调用线程执行任务)等。
以下是通过 ThreadPoolExecutor 创建线程池的示例代码:

ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60L, // 空闲时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(100), // 有界任务队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
通过 Executors 创建预定义线程池
Java 的 Executors 工具类提供了多种预配置的线程池创建方法,简化了开发流程,但需注意部分线程池可能存在资源风险(如无界队列导致 OOM)。
- newFixedThreadPool:创建固定大小的线程池,核心线程数等于最大线程数,使用无界队列,适用于任务量固定的场景。
ExecutorService executor = Executors.newFixedThreadPool(10);
- newCachedThreadPool:创建可缓存线程池,核心线程数为 0,最大线程数为
Integer.MAX_VALUE,使用无界队列,适用于短任务且并发量较高的场景,但需注意任务堆积风险。ExecutorService executor = Executors.newCachedThreadPool();
- newSingleThreadExecutor:创建单线程线程池,始终只有一个线程执行任务,保证任务顺序执行,适用于需要串行化的场景。
ExecutorService executor = Executors.newSingleThreadExecutor();
- newScheduledThreadPool:创建定时任务线程池,支持延迟执行和周期性任务,核心线程数固定,最大线程数无限制。
ScheduledExecutorService executor = Executors.newScheduledThreadPool(5); executor.scheduleAtFixedRate(() -> System.out.println("定时任务"), 1, 1, TimeUnit.SECONDS);
线程池的使用注意事项
- 合理配置参数:根据任务类型(CPU 密集型、IO 密集型)配置线程数,CPU 密集型任务建议线程数设为 CPU 核心数 +1,IO 密集型任务可适当增加线程数。
- 拒绝策略选择:根据业务需求选择合适的拒绝策略,避免任务丢失或系统崩溃。
- 资源关闭:使用完线程池后需调用
shutdown()或shutdownNow()方法关闭线程池,避免资源泄漏。 - 避免无界队列:
Executors创建的某些线程池(如newCachedThreadPool)使用无界队列,可能导致内存溢出,建议优先使用ThreadPoolExecutor自定义队列大小。
线程池的工作流程
当提交任务到线程池时,执行流程如下:

- 若当前线程数小于核心线程数,创建核心线程执行任务。
- 若当前线程数大于等于核心线程数,任务被放入任务队列。
- 若任务队列已满且当前线程数小于最大线程数,创建非核心线程执行任务。
- 若线程数达到最大线程数且队列已满,执行拒绝策略。
通过合理创建和使用线程池,可以有效提升 Java 程序的并发处理能力,同时保证系统资源的稳定利用,开发中需结合实际场景选择合适的线程池类型和参数配置,避免因线程管理不当引发性能问题。



















