拒绝策略
分类
策略 | 具体执行内容 |
---|---|
AbortPolicy | 直接抛出异常。 该策略为未具体设置策略时的默认策略。 |
DiscardPolicy | 直接丢弃任务,无任何其他操作。 |
DiscardOldestPolicy | 丢弃队列中的最靠前的任务。 |
CallerRunsPolicy | 让调用者线程执行当前任务。 |
触发条件
- 队列已满并且线程池中线程数量已达到最大线程数,新加任务触发拒绝策略
具体代码
所用的拒绝策略类都是实现了接口 RejectedExecutionHandler
public interface RejectedExecutionHandler {
/**
* 当线程池无法接受任务时(队列或者线程池已满),执行此方法。
* 或者线程池关闭时,执行此方法。
*
* 该方法会抛出未检查异常 RejectedExecutionException,
* 传播到 execute() 方法的调用者哪里
*
* @param r 需要执行的可执行任务
* @param executor 执行此任务的线程池
* @throws RejectedExecutionException
*/
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}
AbortPolicy
public static class AbortPolicy implements RejectedExecutionHandler {
public AbortPolicy() { }
// 抛出 RejectedExecutionException 异常,此策略未判断线程池的关闭状态
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
}
DiscardPolicy
public static class DiscardPolicy implements RejectedExecutionHandler {
public DiscardPolicy() { }
// 源码可知,该方法中未执行任何操作。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
}
DiscardOldestPolicy
public static class DiscardOldestPolicy implements RejectedExecutionHandler {
public DiscardOldestPolicy() { }
// 获取队列中的下一个任务并忽略,然后重试执行任务
// 如果线程池处于已关闭状态,则直接忽略该任务
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
}
CallerRunsPolicy
public static class CallerRunsPolicy implements RejectedExecutionHandler {
public CallerRunsPolicy() { }
// 由调用 execute() 的线程执行该任务
// 如果线程池处于已关闭状态,则直接忽略该任务
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run(); // 由调用者线程执行该任务。
}
}
}