You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何等待ThreadPoolExecutor线程池出现可用执行空位

实现结论

完全可以实现该需求,首先需要注意:你通过Executors.newFixedThreadPool(10)创建的默认固定大小线程池,本身不具备提交阻塞等待的能力。它默认使用无界的LinkedBlockingQueue作为工作队列,当10个核心线程全部忙碌时,新提交的任务会直接进入队列无限排队,submit/execute方法会在任务入队后立刻返回,不会阻塞调用线程等待空闲工作线程。

要实现「线程池占满时,提交任务的线程阻塞等待,直到出现可用空位再返回」的效果,需要自定义线程池配置和拒绝策略,不要使用Executors提供的默认工厂方法。

具体实现代码
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.SynchronousQueue;

public class CustomFixedThreadPool {
    public static void main(String[] args) {
        int poolSize = 10;
        // 可根据业务调整排队任务的最大容量,不需要排队可以替换为new SynchronousQueue<>()
        int queueCapacity = 5;
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                poolSize,
                poolSize,
                0L,
                TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(queueCapacity),
                // 自定义拒绝策略,实现提交阻塞逻辑
                (runnable, pool) -> {
                    // 线程池已关闭时直接抛异常,避免任务进入队列后无法执行
                    if (pool.isShutdown()) {
                        throw new java.util.concurrent.RejectedExecutionException("线程池已关闭,无法提交任务");
                    }
                    try {
                        // 阻塞式往队列放任务,直到队列有空闲容量才返回
                        pool.getQueue().put(runnable);
                    } catch (InterruptedException e) {
                        // 响应线程中断,重置中断标记
                        Thread.currentThread().interrupt();
                        throw new RuntimeException("提交任务时线程被中断", e);
                    }
                }
        );
    }
}
逻辑说明
  • 核心原理:ThreadPoolExecutor提交任务时,如果核心线程全忙、工作队列也被占满,就会触发配置的拒绝策略。我们在自定义拒绝策略中调用阻塞队列的put()方法,该方法是阻塞方法,会一直挂起当前提交任务的线程,直到队列有剩余容量、任务成功入队后才会返回,实现等待空位的效果。
  • 队列配置说明:如果业务场景不允许任务排队,要求必须有空闲工作线程才接收新任务,可以把工作队列替换为SynchronousQueue,该队列不存储任何任务,没有空闲线程时任务无法交付,就会触发拒绝策略让提交线程阻塞,做到“有空位才提交,无空位就等待”。
  • 避坑提示:不要用“提交前判断活跃线程数”的方式实现,该方式存在竞态条件:判断完活跃线程数到提交任务的间隙,可能有其他线程先提交了任务占满空位,判断结果不准确,线程安全无法保证。

内容的提问来源于stack exchange,提问作者Yavor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:39:09