プライオリティ キューを持つことができれば、各プロデューサーはメッセージ送信カウンターを持つことができると思います。また、キューは 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