首页 > 解决方案 > 如何更改 ScheduledExecutorService 中的线程池大小?

问题描述

我需要带有动态线程池的 ScheduledExecutorService。我想动态更改线程池大小。我怎样才能做到这一点?

class ExecutorTask {
    private ScheduledExecutorService service;

    public void add(Task task) {
        // I need thread pool size == count added tasks.
        service.scheduleAtFixedRate(this::start, 0, 10, TimeUnit.SECONDS);
    }
}

也许你可以建议我另一个线程池?

标签: java

解决方案


您可以使用ScheduledThreadPoolExecutor轻松做到这一点。

    //Init executor
    int initialPoolSize = 5;
    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(initialPoolSize);

    //[...] do something

    //Change max size
    int newPoolSize = 10;
    executor.setCorePoolSize(newPoolSize);

请注意,继承的方法setMaximumPoolSize(int)ScheduledThreadPoolExecutor 没有影响。要更改池大小,您需要更改 corePoolSize:

虽然这个类继承自 ThreadPoolExecutor,但一些继承的调优方法对它没有用。特别是,因为它充当使用 corePoolSize 线程和无界队列的固定大小的池,所以对 maximumPoolSize 的调整没有有用的效果。 此外,将 corePoolSize 设置为零或使用 allowCoreThreadTimeOut 几乎不是一个好主意,因为这可能会使池没有线程来处理任务,一旦它们有资格运行。


推荐阅读