RejectedExecutionHandler是处理线程池拒绝任务的接口,包含rejectedExecution方法;JDK提供四种策略:AbortPolicy抛异常、CallerRunsPolicy由调用线程执行、DiscardPolicy静默丢弃、DiscardOldestPolicy丢弃最老任务;可通过构造函数或setRejectedExecutionHandler设置;可自定义实现,如记录日志或持久化任务;选择策略需根据数据完整性、系统稳定性及业务需求综合考虑。

当Java线程池中的任务队列已满且线程数量达到最大限制时,新提交的任务无法被接受,此时会触发拒绝策略。这个策略由RejectedExecutionHandler接口定义,用于处理那些不能被执行的task。
RejectedExecutionHandler 是一个接口,包含一个方法:void rejectedExecution(Runnable r, ThreadPoolExecutor executor),当任务被拒绝时,该方法会被调用。开发者可以自定义拒绝逻辑,也可以使用JDK提供的几种常见实现。
JDK在ThreadPoolExecutor中提供了四种标准的拒绝策略:
RejectedExecutionException异常,提示任务被拒绝。创建线程池时可以通过构造函数或setRejectedExecutionHandler()方法指定策略:
立即学习“Java免费学习笔记(深入)”;
// 使用自定义或内置策略
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2,
4,
60L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(2),
new ThreadPoolExecutor.AbortPolicy() // 可替换为其他策略
);
// 或动态设置
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
如果内置策略无法满足业务需求,可以实现自己的处理方式:
public class CustomRejectedHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.err.println("任务被拒绝: " + r.toString());
// 可记录日志、写入磁盘队列、发送告警等
}
}
将自定义类传入线程池即可生效。例如在高可用系统中,可将拒绝任务持久化到本地文件或消息队列,后续恢复时重试。
DiscardPolicy或DiscardOldestPolicy,考虑记录日志或落盘。CallerRunsPolicy有助于反压控制,防止雪崩。AbortPolicy适合快速失败设计,便于及时发现问题。以上就是Java中线程池RejectedExecutionHandler处理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号