Search code examples
javaconcurrencyblocking

Converting event driven code to blocking code


I have a class that calls an interface, like the below:

interface MessageReceiver{
  public void messageReceived(Message m);
}

However, because I am receiving messages from multiple sources that I need to synchronise I would instead like to have code that blocks on receiving messages. i.e. I would like to implement the following (blocking) interface, so my calling process can block on a new message coming in:

public Message getNextMessage();

However, my attempts so far end up getting bogged down with Thread synchronisation and locking issues... when really this could be done on the same Thread (concurrency is not required), but I am not sure how, without delving into assembler... and for that, java is probably not the easiest language to do this...

Thanks in advance!


Solution

  • Create intermediate object with a blocking queue inside. Register it as a MessageReceiver.

    class Channel implements MessageReceiver {
      BlockingQueue q=new ArrayBlockingQueue();
    
      public void messageReceived(Message m) {
         q.put(m);
      }
    
      public Message getNextMessage() {
        return q.take();
      }
    }