温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ExecutorService如何控制并发数

发布时间:2026-10-06 19:22:09 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

在 Java 中,ExecutorService 本身不直接提供“并发数”参数,而是通过线程池的实现类来控制并发数量。常见做法如下:


一、使用 ThreadPoolExecutor 控制并发数(最常用)

1. 核心参数决定并发数

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize,      // 核心线程数
    maximumPoolSize,   // 最大线程数
    keepAliveTime,
    TimeUnit.SECONDS,
    new LinkedBlockingQueue<>()
);

✅ 并发数上限 = maximumPoolSize

  • corePoolSize:常驻线程数
  • maximumPoolSize:最多同时运行的线程数
  • 队列用于缓存等待任务

示例:最多 5 个并发

ExecutorService executor = new ThreadPoolExecutor(
    5, 5, 0L, TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<>()
);

二、使用 Executors 工厂方法(简化)

1. 固定线程池(最常用)

ExecutorService executor = Executors.newFixedThreadPool(10);

✅ 并发数 = 10

适用于:

  • 并发数已知
  • 不想任务被无限创建线程

2. 单线程池(并发数 = 1)

ExecutorService executor = Executors.newSingleThreadExecutor();

三、通过“队列 + 最大线程数”间接控制

如果你的任务是 IO 密集型,可以这样设计:

ExecutorService executor = new ThreadPoolExecutor(
    10,
    50,
    60L,
    TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100)
);

含义:

  • 同时最多 50 个线程
  • 超出后进入队列
  • 队列满后拒绝

四、使用 Semaphore 精确控制并发(进阶)

如果你使用的是 CachedThreadPool 或自定义 executor:

Semaphore semaphore = new Semaphore(5);

executor.submit(() -> {
    semaphore.acquire();
    try {
        // 业务逻辑
    } finally {
        semaphore.release();
    }
});

✅ 即使线程池很大,也只会有 5 个任务同时执行


五、Spring 中的线程池(常见)

@Bean
public Executor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(10);
    executor.setQueueCapacity(100);
    return executor;
}

六、总结对照表

方式 并发数控制点
newFixedThreadPool(n) n
ThreadPoolExecutor maximumPoolSize
Semaphore permit 数量
Spring ThreadPoolTaskExecutor maxPoolSize

如果你有具体场景(如:接口限流、批量任务、IO/CPU 密集),我可以帮你选最合适的配置方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手