0

PriorityQueueFIFO 要素を並べ替えるには、 a を使用する必要があります。キューには Message オブジェクトが含まれ、各オブジェクトには と、そのメッセージに対して受信した確認応答の数を追跡する がありますdouble timestampint counterメッセージには、データを含むものと確認を含むものの 2 種類があります。データを含むメッセージのみがキューに入れられます。キューをソートするために使用されるコンパレータを作成しています。すべての承認を受信した場合にのみ、キューの先頭のみをポップします。

問題は、確認メッセージが着信したときに、この確認を受信したメッセージの確認カウンターをインクリメントする必要があることです。このためには、キュー内の各メッセージの特定のフィールド (送信時間) をチェックして、メッセージを見つける必要があります。

これはどのように行うことができますか?私は次のことを考えました:

イテレータを取得してから、各オブジェクトの特定のフィールドをチェックするキューを反復処理します。

これは私には残忍な方法のように思えます。もっと良い方法はありますか?このようなキュー内のオブジェクトにアクセスできますか?


: 実装している機能 (Lamport の論理クロックを使用する分散システムで順序付けされたマルチキャストの合計) には順序付けられたキューが必要なため、PriorityQueue を使用する必要があります。キューの先頭にあるメッセージは、各ノードから承認されないとアプリケーション スレッドに配信できません。また、すべての確認応答を受信した場合でも、キューの先頭にないメッセージを配信することはできません。

4

2 に答える 2

1

最初: はい、-interfacePriorityQueueを実装しているので、そのようにアクセスできます。Iterable

パフォーマンスの問題について考える場合、ある種のピボットを使用して複雑さをログダウンできます (「参考文献」を参照Quicksort)。

馬鹿げていると思う場合: 最も良い解決策は馬鹿げていますが、ほとんどの場合問題なく動作します。

于 2013-03-18T21:18:55.870 に答える
0

間違ったタイプのデータ構造を使用しているように思えます。キュー(つまり、JMSなど)からメッセージを受信して​​いる場合は、キューからメッセージを読み取り、永続性が必要な場合は、データをマップ(HashMapなど)やデータベースなどのより適切なデータ構造に保存してください。

確認応答を受信したら、マップで対応するオブジェクトを検索し、カウントを更新できます。それがあなたが必要とするものであるならば、地図はより速いランダムアクセスを持っているかもしれません。

確認応答カウントをインクリメントし、「確認応答をすべて受信しました」というしきい値に達した場合は、メッセージを新しいキューにプッシュして、必要に応じてさらに処理することができます。

思考のためのいくつかの食べ物。うまくいけば、私はあなたの質問を正しく解釈しました。

于 2013-03-18T21:32:24.513 に答える