java 线程池 拒绝策略
时间: 2024-09-20 16:12:05 浏览: 42
在Java中,线程池是一种管理线程的机制,它预先创建一定数量的线程,并允许提交任务到队列中等待处理。当线程池达到其最大容量且无法立即接受新的任务时,就会触发拒绝策略。这是为了防止无限资源消耗和性能下降。
常用的四种拒绝策略有:
1. **AbortPolicy**:默认的拒绝策略,当线程池满并且有新任务加入时,直接抛出RejectedExecutionException异常,程序需要捕获并处理这个异常,通常会选择停止接收新任务或者扩大线程池。
2. **CallerRunsPolicy**:让调用者(即主线程)执行该任务。这可能会阻塞UI线程,影响用户体验,适用于简单的、短时间的任务。
3. **DiscardOldestJobPolicy**:丢弃队列中最老的任务,然后尝试再次提交当前的任务。适合那些对新鲜数据敏感的任务。
4. **DiscardPolicy**:简单地丢弃任务,没有任何进一步的操作。这对于只关心最新任务的应用场景可能是合适的。
你可以通过设置ThreadPoolExecutor构造函数的`handler`参数来自定义拒绝策略,例如:
```java
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 空闲线程存活时间
TimeUnit.MILLISECONDS, // 时间单位
new DiscardOldestQueue<>(), // 自定义队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
```
阅读全文