7

PriorityBlockingQueue優先フィールドでを使用しています。私のテストではSystem#currentTime()、優先順位に使用します。同じ優先順位は、コンピューターが非常に高速であるためミリ秒が同じであることによって取得されます (または、PC のミリ秒には誤差の範囲があるように)。

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

4

4 に答える 4

11

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

PriorityBlockingQueueドキュメント自体に、これと、必要に応じて回避する方法が記載されています。

于 2012-05-02T14:27:05.027 に答える
2

優先度キューは、等しい要素を取得する順序を保証するとは思いません。1 つのオプションは、優先度をより複雑にすることです。要素をその優先度とともにプッシュするときに、キューのサイズのマイナスをプッシュし、これらの値を優先度の等しい要素と比較します。

于 2012-05-02T14:27:11.080 に答える
1

作成時間を考慮した独自の Comparator を使用して PriorityBlockingQueue を作成するだけです ( http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html#PriorityBlockingQueue(int, java. util.Comparator) )。キーを単純な日付から日付とカウンターのクラスに変更する必要がある場合があります。後者は作成ごとにグローバルにインクリメントされます (新しいキー クラスの静的フィールド)。実際には FIFO ではなく、First Created First Out です。

または、独自の PriorityQueueFifo クラスを実装するだけです。

于 2013-02-18T15:39:03.840 に答える