次のように私はPriorityBlockingQueue
を持っている:PriorityBlockingQueueはブロックしていませんか?
BlockingQueue<Robble> robbleListQueue = new PriorityBlockingQueue<Robble>();
Robble
はComparable<Robble>
を実装し、私は問題なくリストを並べ替えることができていますので、私は私の比較は仕事を知っています。
私はまた、次のRunnableをしている:私はExecutorService
、その後shutdown()
とawaitTermination()
にこれらランナブルの数千を押し
private class RobbleGeneratorRunnable implements Runnable {
private final BlockingQueue<Robble> robbleQueue;
public RobbleGeneratorRunnable(BlockingQueue<ResultList> robbleQueue) {
this.robbleQueue = robbleQueue;
}
@Override
public void run() {
try {
robbleQueue.put(generateRobble());
} catch (InterruptedException e) {
// ...
}
}
private Robble generateRobble() {
// ...
}
}
。
BlockingQueue
JavaDocによると、put(...)
はブロック動作です。しかし、キュー内の項目を繰り返し処理すると、大部分は順序が整っています。キューが適切にブロックされていないことを示すものがいくつかあります。私が前に言ったように、Robble
をうまく並べ替えることができます。
robbleQueue.put(generateRobble())
が正しくブロックされない原因は何ですか?
[このページ](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html)の表を参照してください。 'Blocks'カラムに' put(e) 'を入れてください。それは 'BlockingQueue'インターフェースを実装する契約の違反ではありませんか? –
あなたがリンクしたページから: 'A BlockingQueueは容量制限されている可能性があります。いつでも、残りの容量を超えて、追加の要素をブロックせずに置くことはできません。内在的な容量制約のないBlockingQueueは、常にInteger.MAX_VALUE'の残りの容量を報告します。しかし、[ここ](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html#put(E))を読んだ場合、これはブロックしないことが明確に述べられています。 – Michael
@BobIこれは、実装が容量制限されている場合にのみ適用されます。これはオプションです。 'PriorityBlockingQueue'は明示的に無制限であると述べられています。 – EJP