是否建议将任务添加到 ThreadPoolExecutor 的 BlockingQueue?
用于 ThreadPoolExecutor 的 JavaDoc 不清楚是否可以接受将任务直接添加到支持执行器中。文档说,调用“主要用于调试和监视”。BlockingQueue
executor.getQueue()
我正在用我自己的.我保留了对队列的引用,以便可以直接向其添加任务。返回相同的队列,因此我假设 中的告诫适用于通过我的手段获取的支持队列的引用。ThreadPoolExecutor
BlockingQueue
getQueue()
getQueue()
例
代码的一般模式是:
int n = ...; // number of threads
queue = new ArrayBlockingQueue<Runnable>(queueSize);
executor = new ThreadPoolExecutor(n, n, 1, TimeUnit.HOURS, queue);
executor.prestartAllCoreThreads();
// ...
while (...) {
Runnable job = ...;
queue.offer(job, 1, TimeUnit.HOURS);
}
while (jobsOutstanding.get() != 0) {
try {
Thread.sleep(...);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
executor.shutdownNow();
queue.offer()
与executor.execute()
据我所知,典型的用法是通过 添加任务。我上面示例中的方法具有在队列上阻止的好处,而如果队列已满并拒绝我的任务,则会立即失败。我也喜欢提交作业与阻塞队列交互;这对我来说感觉更“纯粹”的生产者 - 消费者。executor.execute()
execute()
直接向队列添加任务的含义:我必须调用,否则没有工作线程正在运行。假设没有与执行器进行其他交互,则不会监视队列(对源的检查证实了这一点)。这也意味着对于直接排队,必须另外为> 0 个核心线程配置,并且不得配置为允许核心线程超时。prestartAllCoreThreads()
ThreadPoolExecutor
ThreadPoolExecutor
tl;博士
给定如下配置:ThreadPoolExecutor
- 核心线程 > 0
- 不允许核心线程超时
- 核心线程已预启动
- 保持对支持执行程序的引用
BlockingQueue
是否可以将任务直接添加到队列而不是调用?executor.execute()
相关
这个问题(生产者/消费者工作队列)是相似的,但没有具体涵盖直接添加到队列中。