Elegantly implementing queue length indicators to ExecutorServices

concurrency, executor, executorservice, java, queue

Solution

There is a more direct way:

ThreadPoolExecutor executor = new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>() );
// add jobs
// ...
int size = executor.getQueue().size();

This is directly copied from `Executors.newSingleThreadExecutor` in JDK 1.6. The `LinkedBlockingQueue` that is passed to the constructor is actually the very object that you will get back from `getQueue`.

Problem

Why, oh why doesn't `java.util.concurrent` provide a queue length indicators for its `ExecutorService`s? Recently I found myself doing something like this: ``` 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 } } ``` Which works ok, but... I think this really should be implemented as a part of the `ExecutorService`. It's dumb and error prone to carry around a counter separated from the actual queue, whose length the counter is supposed to indicate (reminds me of C arrays). But, `ExecutorService`s are obtained via static factory methods, so there's no way to simply extend the otherwise excellent single thread executor and add a queue counter. So what should I do: - Reinvent stuff already implemented in JDK? - Other clever solution?

Original source

Related problems