通过扩展RejectedExecutionHandler接口,并捕获异常来实现自定义拒绝策略。
下面根据传入的参数丢弃最老的N个线程,以便在出现异常时释放更多的资源,保障后续线程任务整体、稳定地运行。
public class DiscardOldestNPolicy implements RejectedExecutionHandler{
private int discardNum = 5;//线程任务个数
private List<Runnable> discardList = new ArrayList<Runnable>();
public DiscardOldestNPolicy (int discardNumber){
this.discardNum = discardNumber;
}
public void rejectedExecution(Runnable r,ThreadPoolExecutor e){
if(e.getQueue().size() > discardNum ){
//1.批量删除线程队列中的discardNum个线程任务
e.getQueue().drainTo(discardList,discardNum);
//2.清空discardList列表
discardList.clear();
if(e.isShutdown()){//线程未关闭
//3.清空discardList列表
e.execute(r);
}
}
}
}