更改固定线程池最大池大小

A.A*_*A.A 2 java multithreading

目前我正在使用 Executor 服务创建固定线程池,例如

executor = Executors.newFixedThreadPool(coreAmount);
Run Code Online (Sandbox Code Playgroud)

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

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

它似乎newCachedThreadPool()具有这种行为,但我也希望能够创建类似于newFixedThreadPool(int nThreads)

Jos*_*nez 5

也许您可以使用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));
Run Code Online (Sandbox Code Playgroud)

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

corePoolSize - 要保留在池中的线​​程数,即使它们处于空闲状态,除非设置了 allowCoreThreadTimeOut

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

keepAliveTime - 当线程数大于核心数时,这是多余空闲线程在终止前等待新任务的最长时间。

unit - keepAliveTime 参数的时间单位

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