【问题标题】:Which Java thread pool executor to use to easily resize pool size?使用哪个 Java 线程池执行器轻松调整池大小?
【发布时间】:2015-05-22 17:24:20
【问题描述】:

我需要运行大量短期任务。我使用ThreadPoolTaskExecutor,但我需要在运行时自动更改最小/最大线程池大小。怎么做?

我现在使用外部 AtomicInteger 变量并在提交之前增加它并在 lambda-callback 中减少它。我可以以某种方式跳过它吗?只使用线程池执行器而不做其他任何事情?

我阅读了很多文章,但人们不建议这样做,我的解决方案可以吗?或者我可以简化它吗?我用的是spring,我可以用那里的东西吗?

【问题讨论】:

    标签: java spring threadpoolexecutor


    【解决方案1】:

    来自API doc of ThreadPoolExecutor

    (...) 最典型的情况是,核心和最大池大小仅在 构造,但它们也可以使用动态更改 setCorePoolSize(int) 和 setMaximumPoolSize(int)。

    所以如果真的需要在运行时修改这些参数,就实例化一个ThreadPoolExecutor,根据需要进行配置。

    但在您需要动态线程池之前,您应该三思而后行。通常,如果您的任务不绑定到除 CPU 之外的任何其他资源,那么线程比处理器多得多是不利的。

    那么为什么不使用Runtime.getRuntime().availableProcessors() 作为近似值呢?

    【讨论】:

      【解决方案2】:

      现在我想我更了解你的问题了。鉴于该描述,我认为每个工作人员拥有一个 ThreadPoolExecutor 是一种好方法:

        // Worker 1 //
        int w1ThPoSize = 5; // Initially 5 threads are assigned to worker 1
        ThreadPoolExecutor w1ThPo = 
          new ThreadPoolExecutor(w1ThPoSize,
                                 w1ThPoSize,
                                 0, // No excess threads, so keep alive time is not relevant
                                 TimeUnit.MILLISECONDS, // keep alive time is 0, so no relevant
                                 new LinkedBlockingQueue<Runnable>());
      
        // Sending a task for worker 1
        w1ThPo.execute(() -> { System.out.println("I'm running"); });
      
        // Resizing worker 1 thread pool 
        w1ThPoSize = 10;
        w1ThPo.setCorePoolSize(w1ThPoSize);
        w1ThPo.setMaximumPoolSize(w1ThPoSize);
      
        // (similar approach for remaining workers)
      
        // When done, remember to shutdown thread pools!
        w1ThPo.shutdown();
      

      【讨论】:

        【解决方案3】:

        如果我理解的话,您是在要求池在任务开始时创建一个新线程(增加池大小),并在任务结束时要求它关闭一个线程(减小池大小)--请更正如果我误会了你的话!

        这就是你正在做的事情,我会考虑放弃这种方法,而只是'让游泳池成为'。创建线程并不便宜,我假设您的任务可以一次又一次地重用相同的线程(这就是池的用途)。一个好的方法是将线程数设置为 isnot2bad 建议的处理器数。

        【讨论】:

        • 谢谢大家的回复,让我更详细地描述一下。我有f。 e. 5名工人。 Worker - 是一个逻辑工作单元。我的 PM 想要有 4 个 worker1 线程,3 个 worker 2 线程,依此类推。而且他还希望能够在运行时更改每个工作人员的最大线程数。所以我想使用 5 个线程池并分别调整每个线程池中的线程数。你觉得我怎样才能做得更好?谢谢
        猜你喜欢
        • 2014-08-27
        • 2017-12-29
        • 2021-10-03
        • 2012-08-06
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        相关资源
        最近更新 更多