更改固定Threadpool最大池大小

时间:2018-03-04 21:25:22

标签: java multithreading

目前我正在使用像

这样的Executor服务创建固定线程池
executor = Executors.newFixedThreadPool(coreAmount);

虽然这很好,但我想知道是否可以保持创建多个线程的行为并更改最大池限制,以便如果所有线程都在用于创建新线程并使用它而不是等待其中一个线程终止开始。

因此,例如,如果创建并正在使用8个线程,则第9个任务进入我希望它除了创建当前正在使用的8个线程之外还要创建新线程。

似乎newCachedThreadPool()有行为,但我也希望能够创建类似于newFixedThreadPool(int nThreads)的线程数

3 个答案:

答案 0 :(得分:1)

也许你可以使用ThreadPoolExecutor课程。它是ExecutorService,具有核心池数和最大池数的概念。它还具有其他功能,使其比Executors返回的对象更具可自定义性。

以下是一个例子。

    int coreAmount = 8;

    ExecutorService executor;

    //executor = Executors.newFixedThreadPool(coreAmount);

    int overrun = 4;
    int maxWorkCount = 1_000;
    executor = new ThreadPoolExecutor(coreAmount, coreAmount + overrun, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<>(maxWorkCount));

以下是有关上面示例中构造函数中传递的参数的更多信息。

  

corePoolSize - 数量   除非是线程保留在池中,即使它们处于空闲状态   allowCoreThreadTimeOut已设置

     

maximumPoolSize - 最大数量   池中允许的线程

     

keepAliveTime - 当数量   线程大于核心,这是超出的最大时间   空闲线程将在终止之前等待新任务。

     

unit - keepAliveTime参数的时间单位

     

workQueue - 在执行任务之前用于保存任务的队列。此队列将仅保存execute方法提交的Runnable任务。

答案 1 :(得分:1)

就像你说的,缓存的线程池正是你正在寻找的。来自它的documentation

  

创建一个根据需要创建新线程的线程池,但在它们可用时将重用以前构造的线程。这些池通常会提高执行许多短期异步任务的程序的性能。 执行调用将重用以前构造的线程(如果可用)。如果没有可用的现有线程,则将创建一个新线程并将其添加到池中。终止未使用60秒的线程并从缓存中删除。因此,长时间闲置的池不会占用任何资源。

(重点:我的)

  

因此,例如,如果创建并正在使用8个线程,则第9个任务进入我希望它除了创建当前正在使用的8个线程之外还要创建新线程。

\s+开始就是这种情况,如上面的文档所示。

如果您想模拟缓存的线程池,但使用最少Executors#newCachedThreadPool个线程,则可以使用以下内容:

8

答案 2 :(得分:0)

这可以在ThreadPoolExecutor中使用Core Pool&amp;最大池大小值: 从javadoc开始,您可以看到:

  

如果有多个corePoolSize但运行的是最多的maximumPoolSize线程,则只有在队列已满时才会创建新线程

     

通过设置corePoolSize和maximumPoolSize,可以创建固定大小的线程池。

     

通过将maximumPoolSize设置为基本无限制的值(例如Integer.MAX_VALUE),您允许池容纳任意数量的并发任务

     

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

因此,在您的示例中,您需要将'corePoolSize'设置为值8.然后,您需要设置'maximumPoolSize',然后将其作为池的上限。 此外,与javadoc一样,这些值可以动态更改。