【threadpoolexecutor】在Java并发编程中,`ThreadPoolExecutor` 是一个非常重要的类,属于 `java.util.concurrent` 包。它是 Java 线程池的核心实现之一,用于管理一组线程来执行任务,提高系统资源的利用率和响应速度。
一、总结
`ThreadPoolExecutor` 是 Java 中用于创建线程池的类,允许开发者控制线程的数量、任务队列、拒绝策略等。它通过复用线程来减少线程创建和销毁的开销,适用于需要处理大量短生命周期任务的场景。使用 `ThreadPoolExecutor` 可以提升程序性能,同时避免因线程过多而导致的资源浪费。
二、关键属性与配置说明
属性名 | 类型 | 说明 |
corePoolSize | int | 线程池中保持的最小线程数,即使这些线程处于空闲状态。 |
maximumPoolSize | int | 线程池中允许的最大线程数。 |
keepAliveTime | long | 当线程数超过 corePoolSize 时,多余的空闲线程等待新任务的最长时间。 |
unit | TimeUnit | keepAliveTime 的时间单位(如秒、毫秒等)。 |
workQueue | BlockingQueue | 用于保存待执行任务的阻塞队列。 |
threadFactory | ThreadFactory | 用于创建新线程的工厂对象。 |
handler | RejectedExecutionHandler | 当任务被拒绝时的处理策略。 |
三、常见使用方式
1. 使用默认构造函数
通过 `new ThreadPoolExecutor(...)` 手动设置参数。
2. 使用 Executors 工厂方法
- `Executors.newFixedThreadPool(int nThreads)`:固定大小的线程池。
- `Executors.newCachedThreadPool()`:根据需要创建新线程,适合短任务。
- `Executors.newSingleThreadExecutor()`:单线程的线程池。
- `Executors.newScheduledThreadPool(int corePoolSize)`:支持定时任务的线程池。
四、线程池的工作流程
1. 当任务提交到线程池时,首先尝试将任务加入工作队列。
2. 如果队列已满,则尝试创建新线程(不超过 maximumPoolSize)。
3. 如果无法创建新线程,则触发拒绝策略。
五、拒绝策略(RejectedExecutionHandler)
策略 | 说明 |
AbortPolicy | 抛出 `RejectedExecutionException` 异常。 |
CallerRunsPolicy | 由调用线程直接执行该任务。 |
DiscardPolicy | 直接丢弃任务,不抛出异常。 |
DiscardOldestPolicy | 丢弃队列中最老的任务,然后重试添加当前任务。 |
六、适用场景
- 高并发请求处理(如 Web 服务器)
- 后台任务调度
- 多任务并行处理
- 避免频繁创建和销毁线程
七、注意事项
- 合理设置 corePoolSize 和 maximumPoolSize,避免资源浪费或性能下降。
- 使用合适的队列类型(如 `LinkedBlockingQueue`、`SynchronousQueue`)。
- 根据业务需求选择合适的拒绝策略。
- 注意线程安全问题,避免共享资源竞争。
通过合理使用 `ThreadPoolExecutor`,可以显著提升 Java 应用的并发能力和稳定性,是构建高性能服务的重要工具之一。