2012-05-02 15 views
6

私は優先フィールドでPriorityBlockingQueueを使用しています。私のテストでは、優先度にSystem#currentTime()を使用しています。同じ優先度は、コンピュータが非常に速く、ミリ秒が同じである(または、PCのミス秒がエラーマージンを持つように)ことによって得られます。PriorityQueueがキューのように動作しないのはなぜですか?

優先順位は、それは奇妙なようスタック、だかのようにキューが作用同じです。要素の優先順位が同じ場合、キューを通常のキュー(LIFO動作ではなくFIFO)として動作させる代替手段はありますか?

答えて

11

このクラスの操作は、同等の優先度を持つ要素の順序付けを保証しません。順序を強制する必要がある場合は、セカンダリ・キーを使用するカスタム・クラスまたはコンパレータを定義して、プライマリ優先順位値のタイを解除することができます。

PriorityBlockingQueue docs themselvesは、必要に応じてこれを伝えます。

+1

文書を見ましたが、すでにキューをスタックにしないためのユーティリティクラスがあると予想していました。私がキューに入れたら、それはバックに行き、優先度が高い場合はキューをジャンプする必要があります。 – Ben

+2

なぜですか?ほとんどのユーザは優先順位が異なる 'PriorityBlockingQueue' _を使用します。 –

+2

はスタックがキューではないか、これは単なるセマンティクスなのですか? – Ben

2

私は、優先キューが等しい要素を得る順序を保証しているとは思わない。 1つの選択肢は、優先度をより複雑にすることです。要素を優先度と共にプッシュし、これらの値を等しい優先度要素と比較するときにキューのサイズの負数を押します。

1

だけで、アカウントに作成時間を要し、独自のコンパレータ(http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html#PriorityBlockingQueue(int, java.util.Comparator)を参照)とのPriorityBlockingQueueを作成します。 単純なDateからDateとcounterのクラスにキーを変更しなければならない場合があります。この場合、後者はすべての作成(新しいキークラスの静的フィールド)によってグローバルにインクリメントされます。それは実際にはFIFOではなく、最初に作成されたFirst Outです。

または、ちょうどあなた自身のPriorityQueueFifoクラスを実装します。

0

別の解決策は、あなたが優先順位のために使用し、あなたのテストでカウンターを維持することで、あなたはそれぞれの挿入に増加しています。こうすることで、優先順位キューにはテストでFIFO順序が付けられますが、それは任意の優先順位キューのように見えます。

関連する問題