これを行うための基本的な方法は、メッセージが、新しい優先度の高いメッセージを高い優先順位を時間前と言うから、このように優先度の低いメッセージを
古くなるときに優先順位をつり上げることです
public class Message implements Comparable<Message>{
private final long time;//timestamp from creation (can be altered to insertion in queue) in millis the lower this value the older the message (and more important that it needs to be handled)
private final int pr;//priority the higher the value the higher the priority
/**
* the offset that the priority brings currently set for 3 hours
*
* meaning a message with pr==1 has equal priority than a message with pr==0 from 3 hours ago
*/
private static final long SHIFT=3*60*60*1000;
public Message(int priority){
this.pr=priority;
this.time = System.currentTimeMillis();
}
//I'm assuming here the priority sorting is done with natural ordering
public boolean compareTo(Message other){
long th = this.time-this.pr*SHIFT;
long ot = other.time-other.pr*SHIFT;
if(th<ot)return 1;
if(th>ot)return -1;
return 0;
}
}
コメントで述べたように
は、しかし、数時間前から低PRIOのメッセージから洪水が一時的に新しい高PRIOメッセージを餓死し、空間にそれらを適切に、より洗練された方法が必要になります
別の方法では、複数のキューを使用しています。優先度ごとに1つずつ、低優先度キューから取り出されたキューごとに優先度の高いキューをいくつか取り出します。
この最後の方法は、私が提供した最初の方法は、任意の量の優先度を扱うことができます。
このように考えると、優先度の低いメッセージが氾濫した場合、最終的に優先度の高いメッセージが枯渇する可能性はありませんか?優先順位の高いメッセージが早く到着した場合は、修理のためにシステムをシャットダウンする時間ではありませんか? –