线程池拒绝策略触发需同时满足:核心线程全忙、队列已满、新增线程失败;测试应构造确定性饱和状态,用CountingRejectHandler计数并配合CountDownLatch精确控制提交时序,shutdown后新任务必被拒。

要验证线程池拒绝策略的触发条件,核心是**精准构造“饱和+再提交”的状态**,让线程池明确进入拒绝逻辑。不能靠压测或运气,必须控制变量:线程数、队列容量、任务执行时长和提交节奏。
明确触发拒绝策略的三个硬性条件
拒绝策略只在以下三者同时满足时才会被调用(源码级事实,见 ThreadPoolExecutor#addWorker 和 #reject):
- 核心线程已全部忙碌(或已达最大线程数)
- 工作队列已满(
queue.offer()返回false) - 尝试新增线程失败(
addWorker(null, false)返回false)
这意味着测试必须阻塞住所有线程、填满队列,然后立刻再 submit/execute 一个任务——此时拒绝策略必然执行。
写一个可断言的拒绝策略测试类
关键不是看日志或异常是否“出现”,而是捕获拒绝行为本身。推荐自定义一个带计数器的策略:
static class CountingRejectHandler implements RejectedExecutionHandler {
final AtomicInteger count = new AtomicInteger(0);
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
count.incrementAndGet();
}
}
然后构建确定性线程池:
- 核心线程数 = 最大线程数 = 1(避免动态扩容干扰)
- 使用
ArrayBlockingQueue(容量为 1 的有界队列)(1) - 任务体里加
Thread.sleep(1000),确保线程长期占用
这样:1 个线程正在跑 → 队列里塞 1 个待执行任务 → 第 3 次 submit 就必触发拒绝。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
用 CountDownLatch 控制任务提交时序
避免因线程调度导致“任务还没进队列就触发拒绝”。用两个门栓精确同步:
- 第一个
CountDownLatch startLatch = new CountDownLatch(1):让所有任务启动后统一等待 - 第二个
CountDownLatch blockLatch = new CountDownLatch(1):主线程等前两个任务真正入队/执行后再提交第 3 个
示例片段:
CountDownLatch startLatch = new CountDownLatch(1);
CountDownLatch blockLatch = new CountDownLatch(1);
// 提交前两个任务(占满线程+队列)
executor.execute(() -> { startLatch.countDown(); blockLatch.await(); /*模拟长耗时*/ });
executor.execute(() -> { startLatch.countDown(); blockLatch.await(); });
startLatch.await(); // 确保两个任务已启动
blockLatch.countDown(); // 放行它们去执行
// 此时线程忙 + 队列满 → 下一行必触发拒绝
executor.execute(() -> System.out.println("should never reach here"));
assertThat(handler.count.get()).isEqualTo(1);
验证 shutdown 场景下的拒绝
这个更简单直接:
- 创建任意线程池(哪怕刚初始化)
- 立即调用
executor.shutdown()或shutdownNow() - 再调用
execute()或submit() - 断言是否抛出
RejectedExecutionException(对AbortPolicy)或计数器是否增加(对自定义策略)
注意:shutdown() 后仍允许 submit() 已排队任务,但新提交一定被拒;shutdownNow() 还会尝试中断运行中任务,但新提交同样走拒绝流程。
不复杂但容易忽略:每次测试完记得 shutdownNow() 并 awaitTermination,防止线程残留影响后续用例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










