定义拒绝策略,需要重写RejectedExecutionHandler接口的rejectedExecution(Runnable r, ThreadPoolExecutor executor);方法。
public interface RejectedExecutionHandler {
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}
AbortPolicy策略
该策略直接抛出异常。
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());
}
}
注意:使用此拒接策略,切记ThreadPoolExecutor.execute需要try catch,否则程序会直接退出。
CallerRunsPolicy策略
public static class CallerRunsPolicy implements RejectedExecutionHandler {
public CallerRunsPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
}
从源码可以看出:只要线程池未关闭,该策略直接在调用者线程(如Main方法)中运行当前被丢弃的任务。显然这样不会真的丢弃任务,但是,调用者线程性能可能急剧下降。
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);
}
}
}
一般在实际开发中,根据业务需求,自定义拒绝策略。