Элегантная реализация индикаторов длины очереди в ExecutorServices
Почему нетjava.util.concurrent
обеспечить показатели длины очереди для егоExecutorService
s? Недавно я обнаружил, что делаю что-то вроде этого:
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
Получаются с помощью статических фабричных методов, так что нет способа просто расширить отличный в другом случае однопоточный исполнитель и добавить счетчик очереди. И что же мне делать: