java 线程池中实现自定义拒绝策略,核心是创建类并实现 rejectedexecutionhandler 接口。你需要重写 rejectedexecution() 方法,在其中定义当队列满且线程池无法接收新任务时的处理逻辑,例如记录日志、丢弃任务或抛出异常。最后,在构建 threadpoolexecutor 时通过构造函数传入该实例即可生效。

如何编写一个记录日志的拒绝处理器
直接回答:创建一个实现 RejectedExecutionHandler 接口的类,并在 rejectedExecution 方法中调用日志框架(如 Logger)打印错误信息。这样可以在任务被拒绝时保留现场信息,便于后续排查问题。

import java.util.concurrent.*;
public class LoggingRejectHandler implements RejectedExecutionHandler {
private static final Logger LOG = Logger.getLogger(LoggingRejectHandler.class.getName());
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
LOG.severe("Task rejected: " + r.getClass().getName() +
", Pool size: " + executor.getPoolSize() +
", Queue size: " + executor.getQueue().size());
}
}
使用示例:
立即学习“Java免费学习笔记(深入)”;
ThreadPoolExecutor pool = new ThreadPoolExecutor(
5, 10, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100),
Executors.defaultThreadFactory(),
new LoggingRejectHandler()
);
如何实现一个丢弃任务的拒绝处理器
直接回答:创建一个实现 RejectedExecutionHandler 接口的类,在 rejectedExecution 方法中不执行任何操作。这种策略适用于对实时性要求不高、允许部分任务丢失的场景,能避免阻塞主流程。

import java.util.concurrent.*;
public class DiscardRejectHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 什么都不做,直接丢弃
}
}
使用示例:
立即学习“Java免费学习笔记(深入)”;
ThreadPoolExecutor pool = new ThreadPoolExecutor(
5, 10, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100),
Executors.defaultThreadFactory(),
new DiscardRejectHandler()
);
当线程池关闭时提交任务会发生什么
直接回答:如果线程池已经调用 shutdown() 或 shutdownNow(),再向其中提交任务会触发拒绝策略。此时 rejectedExecution 方法会被调用,但通常建议先检查 isShutdown() 状态以避免不必要的拒绝。


















