ThreadPoolExecutor里面4种拒绝策略
时间: 2023-10-21 11:33:57 浏览: 41
ThreadPoolExecutor是Java中的一个线程池实现,当提交的任务超过线程池的最大容量时,就需要使用拒绝策略来处理这些任务。ThreadPoolExecutor提供了4种拒绝策略:
1. AbortPolicy(默认):直接抛出RejectedExecutionException异常,阻止系统正常运行。
2. CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。
3. DiscardOldestPolicy:丢弃最老的一个请求任务,也就是即将被执行的任务,并尝试重新提交当前任务。
4. DiscardPolicy:丢弃无法处理的任务,不予任何处理也不抛出异常。
相关问题
ThreadPoolExecutor拒绝策略
ThreadPoolExecutor拒绝策略是指当线程池无法接受新的任务时,如何处理这些被拒绝的任务。ThreadPoolExecutor提供了几种不同的拒绝策略。其中,DiscardPolicy是一种拒绝策略,它会直接丢弃当前的任务,而不会抛出异常。
另一种拒绝策略是CallerRunsPolicy,它会由调用线程(也就是提交任务的线程)来处理该任务。当任务被拒绝时,如果线程池没有关闭,调用线程会执行该任务。
举个例子,如果我们创建了一个ThreadPoolExecutor对象并指定了DiscardPolicy作为拒绝策略,当线程池中的线程数达到最大值并且阻塞队列也已满时,新的任务将被直接丢弃。
总之,ThreadPoolExecutor的拒绝策略决定了当线程池无法接受新任务时的处理方式,可以根据具体需求选择合适的拒绝策略来处理被拒绝的任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [Java并发编程系列27:ThreadPoolExecutor的4种拒绝策略](https://blog.csdn.net/fen_fen/article/details/122909142)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
ThreadPoolExecutor的拒绝策略参数
ThreadPoolExecutor的拒绝策略参数是用于处理线程池中任务队列已满,无法继续添加任务时的策略。当线程池中的任务队列已满,且线程池中的线程数已经达到最大线程数时,线程池会采用拒绝策略来处理新的任务。ThreadPoolExecutor提供了四种拒绝策略参数,分别是:
1. AbortPolicy:直接抛出异常,默认策略;
2. CallerRunsPolicy:只用调用者所在线程来运行任务;
3. DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务;
4. DiscardPolicy:不处理,直接丢弃任务。
自定义拒绝策略需要实现RejectedExecutionHandler接口,并重写rejectedExecution方法,该方法会在任务被拒绝时被调用。在该方法中,可以自定义处理被拒绝的任务,例如重新开启一个线程来执行被拒绝的任务。
示例代码如下:
```java
public class CustRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
new Thread(r,"线程:"+new Random().nextInt(10)).start();
}
}
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
1, 2, 10, TimeUnit.MICROSECONDS, new LinkedBlockingDeque<>(2), new CustRejectedExecutionHandler());
```
默认的拒绝策略是AbortPolicy,其实现代码如下:
```java
public static class AbortPolicy implements RejectedExecutionHandler {
public AbortPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + e.toString());
}
}
```