jdk默认提供以下四种线程池拒绝策略
- AbortPolicy:直接抛出一个RejectedExecutionException异常(默认使用)
public static class AbortPolicy implements RejectedExecutionHandler {
/**
* 构造函数
*/
public AbortPolicy() { }
/**
* 始终抛出RejectedExecutionException
*
* @param r 执行的任务
* @param e 执行器
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
}
- CallerRunsPolicy:重试策略,如果线程池未关闭,一直重试
public static class CallerRunsPolicy implements RejectedExecutionHandler {
/**
* 构造函数
*/
public CallerRunsPolicy() { }
/**
* 在执行器的中重试执行任务r,除非执行器已关闭,在这种情况下任务将被丢弃。
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
}
- DiscardOldestPolicy:丢弃最旧的未处理任务
public static class DiscardOldestPolicy implements RejectedExecutionHandler {
/**
* 构造函数
*/
public DiscardOldestPolicy() { }
/**
* 丢弃最旧的未处理任务r
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
}
- DiscardPolicy:直接丢弃当前任务
public static class DiscardPolicy implements RejectedExecutionHandler {
/**
* 构造函数
*/
public DiscardPolicy() { }
/**
* 什么事情也不做,直接丢弃任务r
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
}
在实际项目中,可根据需求去实现RejectedExecutionHandler 接口