📌 线程池配置回顾:
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // corePoolSize 核心线程数
4, // maximumPoolSize 最大线程数
60, TimeUnit.SECONDS, // 非核心线程空闲存活时间
new ArrayBlockingQueue<>(2),// 有界任务队列(最多容纳2个任务)
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
你随后提交了 10 个任务:
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
System.out.println(Thread.currentThread().getName() + " is executing");
});
}
🚀 执行过程详解(任务 i = 0 到 9)
提交顺序 | 当前情况 | 执行结果 |
---|---|---|
i = 0 | 核心线程数 < 2 → 创建线程执行任务 | 创建线程1执行 |
i = 1 | 核心线程数 < 2 → 创建线程执行任务 | 创建线程2执行 |
i = 2 | 核心线程已满,队列未满 → 入队 | 放入队列 |
i = 3 | 核心线程已满,队列未满 → 入队 | 放入队列 |
i = 4 | 核心线程满 + 队列满 → 创建非核心线程 | 创建线程3执行 |
i = 5 | 核心线程满 + 队列满 → 创建非核心线程 | 创建线程4执行 |
i = 6 | 核心 + 非核心线程都满,队列也满 | 启动拒绝策略 → 调用者线程执行 |
i = 7 | 同上 → 调用者线程执行任务 | 主线程执行 |
i = 8 | 同上 → 调用者线程执行任务 | 主线程执行 |
i = 9 | 同上 → 调用者线程执行任务 | 主线程执行 |