优雅地为ExecutorServices实现队列长度指示器

乔纳斯·普拉卡(Joonas Pulakka):

为什么,为什么不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数组)。但是,ExecutorServices是通过静态工厂方法获得的,因此无法简单地扩展原本出色的单线程执行程序并添加队列计数器。所以我该怎么做:

  1. 重塑JDK中已经实现的东西?
  2. 其他聪明的解决方案?
x4u :

还有一种更直接的方法:

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newSingleThreadExecutor();
// add jobs
// ...
int size = executor.getQueue().size();

尽管您可能考虑不使用Executor的便捷创建方法,而是直接创建executor来摆脱类型转换,从而确保executor实际上始终是a ThreadPoolExecutor,即使的实现Executors.newSingleThreadExecutor会改变一天。

ThreadPoolExecutor executor = new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>() );

这是直接从Executors.newSingleThreadExecutorJDK 1.6中复制的LinkedBlockingQueue传递给构造实际上是非常的对象,你将回来getQueue

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章