2012-03-08 8 views
0

次のように私はPriorityBlockingQueueを持っている:PriorityBlockingQueueはブロックしていませんか?

BlockingQueue<Robble> robbleListQueue = new PriorityBlockingQueue<Robble>(); 

RobbleComparable<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())が正しくブロックされない原因は何ですか?

答えて

1

PriorityQueueまたはPriorityBlockingQueueを繰り返すことは、Javadocで順序付けされていないことが明示されています。 add(),peek()poll()、およびremove()のみが発注されます。これはブロッキングが正しく起こっているかどうかとは関係ありません。 Javadocをよれ

1

PriorityBlockingQueueはアンバウンド形式のキューで、あなたは(プットのJavadocを読んでいる場合)には、状態:

挿入し、この優先度キューに指定された要素を。キュー は無制限であるため、このメソッドは決してブロックされません。

なぜput()がブロックされると思いますか?

+0

[このページ](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html)の表を参照してください。 'Blocks'カラムに' put(e) 'を入れてください。それは 'BlockingQueue'インターフェースを実装する契約の違反ではありませんか? –

+0

あなたがリンクしたページから: 'A BlockingQueueは容量制限されている可能性があります。いつでも、残りの容量を超えて、追加の要素をブロックせずに置くことはできません。内在的な容量制約のないBlockingQueueは、常にInteger.MAX_VALUE'の残りの容量を報告します。しかし、[ここ](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html#put(E))を読んだ場合、これはブロックしないことが明確に述べられています。 – Michael

+0

@BobIこれは、実装が容量制限されている場合にのみ適用されます。これはオプションです。 'PriorityBlockingQueue'は明示的に無制限であると述べられています。 – EJP

4

メソッド・イテレータ(に設けられたイテレータ)は に保証されていないが、任意の特定の順序で優先度キューの要素を横切ります。あなたが注文したトラバーサルが必要な場合は、 は、Arrays.sort(pq.toArrayを())の使用を検討

、追加PEEK、世論調査や削除優先順位で動作するために必要とされているではなく、イテレータ。

関連する問題