
package javacodebook.thread.syncblock2;

import java.util.Random;

/**
 * Ein lesender Thread. Er liest aus einer MessageQueue Nachrichten, die von
 * einem anderen Thread in die Queue geschrieben wurden.
 *
 * @author Mark Donnermeyer
 */
class ReceiverThread extends Thread {
    private static Random random = new Random(System.currentTimeMillis());
    
    private MessageQueue queue;
    private boolean stop = false;
    
    public ReceiverThread(String name, MessageQueue queue) {
        super(name);
        this.queue = queue;
    }
    
    public void run() {
        // Der Empfänger liest solange Daten aus der MessageQueue, bis die
        // Queue leer ist und der Thread gestoppt werden soll. Zwischen zwei
        // Versuchen, eine Nachricht zu lesen, schläft der Thread zwischen 0
        // und 1 Sekunde.
        Object msg = null;
        while(stop == false || msg != null) {
            sleepRandomly(1000);
            msg = queue.recv();
            if (msg == null)
                System.out.println("Queue ist leer");
            else
                System.out.println(msg);
        }
    }
    
    private void sleepRandomly(int max) {
        try {
            sleep(random.nextInt(max));
        }
        catch (Exception ignore) {}
    }
    
    /**
     * Der Thread soll gestoppt werden
     */
    public void stopExecution() {
        this.stop = true;
    }
}