package javacodebook.thread.syncblock2;

import java.util.Vector;

/**
 * Eine Message-Queue. Jede Nachricht wird in einem Vector gespeichert. Der
 * Empfang einer Nachricht und das Senden einer Nachricht können nicht gleich-
 * zeitig erfolgen, da die einzelnen Blöcke synchronisiert sind.
 */
public class MessageQueue {
    Vector queue = new Vector();
    
    /**
     * Fügt eine neue Nachricht an das Ende der Message-Queue an. Nur ein
     * Thread kann gleichzeitig eine Nachricht anfügen. In dieser Zeit kann
     * auch kein Thread eine Nachricht aus der Queue lesen.
     */
    public synchronized void send(Object obj) {
        queue.addElement(obj);
    }
    
    /**
     * Liest die älteste Nachricht aus der Message-Queue aus. Nur ein Thread
     * kann gleichzeitig eine Nachricht lesen. In dieser Zeit kann auch kein
     * Thread eine neue Nachricht an die Queue anhängen.
     */
    public synchronized Object recv() {
        if (queue.size() == 0)
            return null;
        
        Object obj = queue.firstElement();
        queue.removeElementAt(0);
        return obj;
    }
}