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()
如果队列已满并拒绝我的任务,则会立即失败。我也喜欢提交作业与阻塞队列交互;这对我来说感觉更“纯粹”的生产者消费者。
直接将任务添加到队列的含义:我必须调用prestartAllCoreThreads()
否则没有工作线程正在运行。假设没有与执行程序的其他交互,则不会监视队列(ThreadPoolExecutor
来源检查证实了这一点)。这也意味着对于直接入队,ThreadPoolExecutor
必须另外为 > 0 个核心线程进行配置,并且不得将其配置为允许核心线程超时。
tl;博士
给定一个ThreadPoolExecutor
配置如下:
- 核心线程 > 0
- 核心线程不允许超时
- 核心线程已预先启动
- 持有对
BlockingQueue
支持执行者的引用
将任务直接添加到队列而不是调用是否可以接受executor.execute()
?
有关的
这个问题(生产者/消费者工作队列)类似,但不具体涉及直接添加到队列中。