4种拒绝策略
java的线程池目前有4种拒绝策略,如下图:
如果在创建线程池的时候没有指定拒绝策略,默认会采用 AbortPolicy。
private static final RejectedExecutionHandler defaultHandler =
new AbortPolicy();
1. AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
2. CallerRunsPolicy:只⽤调⽤者所在的线程来处理任务
3. DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执⾏当前任务
4. DiscardPolicy:直接丢弃任务,也不抛出异常
源码如下,都实现了RejectedExecutionHandler 接口,是策略模式的一种体现。
public static class CallerRunsPolicy implements RejectedExecutionHandler {
public CallerRunsPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
// 线程池没有被shutdown的情况下 就让caller去 run当前这个任务,
//caller 是线程池的调用者
// 如果线程池被shutdown 了,那么当前任务就会被抛弃。
if (!e.isShutdown()) {
r.run();
}
}
}
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());
}
}
public static class DiscardPolicy implements RejectedExecutionHandler {
public DiscardPolicy() { }
// 直接抛弃任务 没有任何信息输出
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
}
public static class DiscardOldestPolicy implements RejectedExecutionHandler {
public DiscardOldestPolicy() { }
// 线程池没有被shutdown的情况下 就抛弃队列中 等的最久的任务(队头),空出位置给当前任务
//(多线程下有可能失败,会不断的调用相应的拒绝策略直到成功)
// 如果线程池被shutdown 了,那么当前任务就会被抛弃。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
}
自定义一种拒绝策略
相当于把一个接口组合了进来,我们可以重写该接口的方法,自定义一种拒绝策略。
比如:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92785.html