线程池ThreadPoolExecutor中RejectedExecutionHandler常见拒绝策略
JDK提供的几种拒绝策略:
AbortPolicy:当前拒绝策略会在无法处理任务时,直接抛出一个异常。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
CallerRunsPolicy:如果任务被拒绝了,则由调用线程(提交任务的线程)直接执行此任务(谁提交的谁执行)
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
DiscardPolicy:直接将任务丢弃掉。一般情况下很少这么干。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
DiscardOldestPolicy:当前拒绝策略会在线程池无法处理任务时,将队列中最早的任务丢弃掉,将当前任务再次尝试交给线程池处理
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
自定义拒绝Policy:需要我们实现RejectedExecutionHandler接口,并重写里面的rejectedExecution()方法,根据自己的业务,可以将任务扔到数据库,也可以做其他操作。
private static class MyRejectedExecution implements RejectedExecutionHandler{
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("根据自己的业务情况,决定编写的代码!");
}
}