【发布时间】:2011-01-16 23:25:40
【问题描述】:
为什么,哦,为什么java.util.concurrent 不为其ExecutorServices 提供队列长度指示器?最近我发现自己在做这样的事情:
ExecutorService queue = Executors.newSingleThreadExecutor();
AtomicInteger queueLength = new AtomicInteger();
...
public void addTaskToQueue(Runnable runnable) {
if (queueLength.get() < MAX_QUEUE_LENGTH) {
queueLength.incrementAndGet(); // Increment queue when submitting task.
queue.submit(new Runnable() {
public void run() {
runnable.run();
queueLength.decrementAndGet(); // Decrement queue when task done.
}
});
} else {
// Trigger error: too long queue
}
}
这行得通,但是...我认为这确实应该作为ExecutorService 的一部分来实现。从实际队列中携带一个 分离 的计数器是愚蠢且容易出错的,计数器应该指示其长度(让我想起了 C 数组)。但是,ExecutorServices 是通过静态工厂方法获得的,因此无法简单地扩展其他出色的单线程执行器并添加队列计数器。那我该怎么办:
- 重新发明已经在 JDK 中实现的东西?
- 其他巧妙的解决方案?
【问题讨论】:
标签: java concurrency queue executorservice executor