【发布时间】:2011-03-27 15:17:44
【问题描述】:
我正在尝试使用 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,因为任务数超过了工作队列的大小。但是,我正在寻找的期望行为是让主线程阻塞,直到队列中有空间。实现这一目标的最佳方法是什么?
【问题讨论】:
-
This answer to another question建议使用自定义
BlockingQueue子类,通过委托给put()来阻止offer()。我认为最终的工作方式与调用getQueue().put()的RejectedExecutionHandler大致相同。 -
直接放入队列是不正确的,正如这个答案stackoverflow.com/a/3518588/585903
-
@SumitJain 仔细阅读该答案;该答案中提出的三个反对意见中只有一个适用于@Robert Tupelo-Schneck 评论中建议的方法。通过从队列本身中调用
put(),您不会通过getQueue()访问队列(反对#3),并且如果需要,您放入的对象已经正确包装(反对#2)。如果您的所有线程在项目离开队列之前都死了,您仍然面临死锁的风险,但这可能是大多数寻求此特定解决方案的人愿意承担的风险。
标签: java multithreading concurrency executorservice executor