我试图使用ThreadPoolExecutor执行许多任务.以下是一个假设的例子:
def workQueue = new ArrayBlockingQueue<Runnable>(3, false)
def threadPoolExecutor = new ThreadPoolExecutor(3, 3, 1L, TimeUnit.HOURS, workQueue)
for(int i = 0; i < 100000; i++)
threadPoolExecutor.execute(runnable)
Run Code Online (Sandbox Code Playgroud)
问题是我很快得到了java.util.concurrent.RejectedExecutionException,因为任务数量超过了工作队列的大小.但是,我正在寻找的所需行为是让主线程阻塞,直到队列中有空间.完成此任务的最佳方法是什么?
目前我正在使用 Executor 服务创建固定线程池,例如
executor = Executors.newFixedThreadPool(coreAmount);
Run Code Online (Sandbox Code Playgroud)
虽然这很好,但我想知道是否有可能保持创建多个线程的行为并更改最大池限制,以便在所有线程都在使用时创建一个新线程并使用它而不是等待其中一个要终止以启动的线程。
因此,例如,如果创建并正在使用 8 个线程,则第 9 个任务进入我希望它在当前使用的 8 个线程之外创建一个新线程。
它似乎newCachedThreadPool()具有这种行为,但我也希望能够创建类似于newFixedThreadPool(int nThreads)