线程池的拒绝策略、如何合理分配线程池大小
时间: 2024-08-22 21:00:19 浏览: 80
线程池的拒绝策略是指当线程池已经达到最大工作线程数但仍接收到新的任务时,采取的不同处理方式。常见的几种拒绝策略包括:
1. **AbortPolicy**(默认策略):直接抛出RejectedExecutionException异常,终止当前线程并回滚任务到队列头部。
2. **CallerRunsPolicy**:让调用者(通常主线程)继续运行新任务,而不是放入线程池。这种方式可能导致主线程阻塞,适用于那些不需要并发执行的任务。
3. **DiscardOldestJobPolicy**:丢弃线程池中最早的任务,然后接受新的任务,适用于优先级较高的任务可以随时添加的情况。
4. **DiscardPolicy** 或 **DiscardPolicyFactory**:直接丢弃新任务,不会抛出异常,适合资源有限、任务瞬息万变的场景。
合理分配线程池大小主要考虑以下几个因素:
- **CPU核心数**:通常线程数不应超过CPU的核心数,因为过多会增加上下文切换开销。
- **并发任务量**:根据应用预期同时处理的请求量设置。
- **任务性质**:I/O密集型任务可以适当多设,CPU密集型任务应少设避免过度竞争。
- **预留空间**:为了应对突发流量,可以留出一部分空闲线程。
- **吞吐量和响应时间**:需要权衡在保证系统性能的同时,提供足够的快速响应。
要确定具体的线程池大小,可以通过监控系统的负载和调整来优化,或者采用动态调整的算法如Hystrix、Spring ThreadPool等工具。
阅读全文