プライオリティ キューを持つことができれば、各プロデューサーはメッセージ送信カウンターを持つことができると思います。また、キューは messageSent 番号と日付に基づいて順序付けされ、送信された番号が他のメッセージよりも小さい場合、メッセージは別のメッセージの前に送信されるようになります。
Javaで
class Message { //or you can implement Comparable<Message>
final Date created = new Date();
final int messageNumber;
public Message(int m ){this.messageNumber = m;}
}
BlockingQueue<Message> queue = new PriorityBlockingQueue<Message>(new Comparator(){
public int compare(Message m1, Message m2){
if(m1.messageNumber < m2.messageNumber) return 1;
if(m2.messageNumber < m1.messageNumber) return -1;
if(m1.messageNumber == m2.messageNumber) return m1.created.compareTo(m2.created);
}
});
class Provider{
int currentMessage = 0;
void send(){
queue.offer(new Message(currentMessage++));
}
}
したがって、Producer 1 が (最初に) 5 つの要素をキューに追加し、Producer 2 が 1 を追加すると、キューは次のようになります。
P1: 5
P1: 4
P1: 3
P1: 2
P2: 1
P1: 1