38

なぜ、ああ、なぜその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配列を思い出させます)。ただし、ExecutorServicesは静的ファクトリメソッドを介して取得されるため、他の点では優れたシングルスレッドエグゼキュータを単純に拡張してキューカウンタを追加する方法はありません。だから私は何をすべきか:

  1. JDKにすでに実装されているものを再発明しますか?
  2. 他の賢い解決策?
4

2 に答える 2

65

より直接的な方法があります:

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

エグゼキュータの便利なcreateメソッドを使用せずに、キャストを取り除くためにエグゼキュータを直接作成することを検討するかもしれませんがThreadPoolExecutor、実装がExecutors.newSingleThreadExecutorいつか変更される場合でも、エグゼキュータが常に実際にになるようにしてください。

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

Executors.newSingleThreadExecutorこれは、JDK1.6から直接コピーされます。LinkedBlockingQueueコンストラクターに渡されるのは、実際にはから返されるオブジェクトそのものですgetQueue

于 2010-02-15T14:08:40.260 に答える
4

キューサイズを直接確認できますが。長くなりすぎているキューを処理する別の方法は、内部キューを制限することです。

public static
ExecutorService newFixedThreadPoolWithQueueSize(int nThreads, int queueSize) {
  return new ThreadPoolExecutor(nThreads, nThreads,
                              5000L, TimeUnit.MILLISECONDS,
                              new ArrayBlockingQueue<Runnable>(queueSize, true));
}

これにより、制限を超えるとRejectedExecutionExceptions(これを参照)が発生します。

例外を回避したい場合は、呼び出し元のスレッドを乗っ取って関数を実行できます。解決策については、このSOの質問を参照してください。

参考文献

于 2016-12-06T20:40:56.337 に答える