接口定义
首先查看源码拒绝执行策略是一个接口而不是一个类. 这个接口只定义了一个方法就是rejectedExcution()
参数是一个任务(Runable)和一个线程池.
public interface RejectedExecutionHandler {
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}
常用实现类
在java.util.concurrent.ThreadPoolExecutor这个类的代码中存在着4个静态类实现拒绝策略的接口,他们分别是
* CallerRunsPolicy 交给主线程处理
* AbortPolicy 不处理抛异常
* DiscardPolicy 完全不处理
* DiscardOldestPolicy 删掉线程池中最旧的任务把这个任务加入线程池.
//线程池拒绝任务后任务不通过线程池直接运行
public static class CallerRunsPolicy implements RejectedExecutionHandler {
public CallerRunsPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run(); //自己运行了
}
}
}
//拒绝运行, 会抛出一个RejectedExecutionException异常.
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() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
}
自定义处理策略
有些时候默认的处理策略不能满足我们的需要,我们就只能自己定义处理策略的, 只要继承RejectedExecutionHandler接口就可以了.
public class CustomRejectPolicy implements RejectedExecutionHandler{
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("执行自定义处理策略!");
}
}