我正在尝试使用 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)
问题是我很快得到一个 java.util.concurrent.RejectedExecutionException
因为任务数量超过了工作队列的大小。但是,我正在寻找的理想行为是让主线程阻塞,直到队列中有空间为止。完成此任务的最佳方法是什么?
原文由 ghempton 发布,翻译遵循 CC BY-SA 4.0 许可协议
在一些非常狭窄的情况下,您可以实现一个 java.util.concurrent.RejectedExecutionHandler 来执行您需要的操作。
现在。由于以下原因,这是 一个非常糟糕的主意
几乎总是更好的策略是安装 ThreadPoolExecutor.CallerRunsPolicy,它将通过在调用 execute() 的线程上运行任务来限制您的应用程序。
然而,有时一个具有所有固有风险的阻止策略确实是您想要的。我会说在这些条件下
所以,正如我所说。它很少需要并且可能很危险,但你去吧。
祝你好运。