为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小唯快跑啊 2022-06-15 16:28:22
我需要带有动态线程池的 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 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

您可以使用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 几乎不是一个好主意,因为一旦它们有资格运行,这可能会使池没有线程来处理任务。


查看完整回答
反对 回复 2022-06-15
?
暮色呼如

TA贡献1853条经验 获得超9个赞

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

还使用Executors.newCachedThreadPool您提供创建线程池大小的责任ThreadPoolExecutor

如果ThreadPoolExecutor需要执行新任务,则创建新线程,并重用现有线程Executors.newCachedThreadPool()


查看完整回答
反对 回复 2022-06-15
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

也许这就是您在 Executors Util 类中寻找的内容:

ExecutorService executorService = Executors.newScheduledThreadPool(5)


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 422 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信