如何在ScheduledExecutorService中更改线程池大小?

时间:2019-02-11 12:45:56

标签: java

我需要带有动态线程池的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);
    }
}

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

3 个答案:

答案 0 :(得分:1)

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

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

    //[...] do something

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

请注意,继承的方法setMaximumPoolSize(int)具有no effect on ScheduledThreadPoolExecutor。要更改池大小,您需要更改corePoolSize:

  

尽管此类从ThreadPoolExecutor继承,但其中一些   继承的调整方法对此没有用。 尤其是因为   它使用corePoolSize线程和一个固定大小的池   无限制的队列,对maximumPoolSize的调整没有任何作用。   此外,将corePoolSize设置为   零或使用allowCoreThreadTimeOut,因为这可能会离开池   一旦任务有资格运行,就没有线程来处理任务。

答案 1 :(得分:0)

也许这是您在Executors Util类中寻找的东西:

ExecutorService executorService = Executors.newScheduledThreadPool(5)

答案 2 :(得分:0)

您可以使用setCorePoolSize(int)方法。

还使用Executors.newCachedThreadPool来为ThreadPoolExecutor创建线程池大小。

ThreadPoolExecutor根据需要创建新线程来执行新任务,并与Executors.newCachedThreadPool()重复使用现有线程