通过实现RejectedExecutionHandler接口,自定义一个拒绝策略类,重写它的rejectedExecution()方法:
public class CustomRejectionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println(r.toString() + "被拒绝了,执行入库操作,之后手动补偿");
}
}
测试下:
public class SpringbootApplication {
private static AtomicInteger atomicInteger = new AtomicInteger(1);
public static void main(String[] args) throws Exception {
CustomRejectionHandler customRejectionHandler = new CustomRejectionHandler();
ExecutorService executorService = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingDeque<>(10), customRejectionHandler);
for (int i = 0; i < 20; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
System.out.println("第" + atomicInteger.getAndIncrement() + "个任务被执行");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
运行结果:
因为核心线程数和最大线程数都是5,而队列容量是10,所以同一时间最多可接受15个任务,加了个睡眠时间1s,然后可以发现20个任务中只有15个任务被执行,剩下的5个任务都执行了自定义的拒绝策略。
总结
有时候默认提供的拒绝策略无法满足业务需要,那么就需要开发自己定义符合要求的拒绝策略了。