なぜ、ああ、なぜそのsのjava.util.concurrent
キュー長インジケーターを提供しないのですか?ExecutorService
最近、私は自分が次のようなことをしていることに気づきました。
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配列を思い出させます)。ただし、ExecutorService
sは静的ファクトリメソッドを介して取得されるため、他の点では優れたシングルスレッドエグゼキュータを単純に拡張してキューカウンタを追加する方法はありません。だから私は何をすべきか:
- JDKにすでに実装されているものを再発明しますか?
- 他の賢い解決策?