package javacodebook.thread.wait_notify;

import java.util.Random;

/**
 * Ein Thread, der versucht, Nachrichten aus einer MessageQueue zu lesen.
 * @author Mark Donnermeyer
 */
class ReceiverThread extends Thread {
    private static Random random = new Random(System.currentTimeMillis());
    
    private MessageQueue queue;
    private int sleepMax;
    
    /*
     * Der Thread wird mit einem Namen und der MessageQueue initialisiert
     */
    public ReceiverThread(String name, MessageQueue queue, int sleepMax) {
        super(name);
        this.queue = queue;
        this.sleepMax = sleepMax;
    }

    /**
     * Solange es etwas zu lesen gibt, liest der Thread Nachrichten aus der 
     * Queue und schläft zwischendurch für eine zufällige Zeit lang.
     */
    public void run() {
        Object msg = null;
        while(true) {
            sleepRandomly();
            msg = queue.recv();
            if (msg == null)
                break;
            System.out.println(getName() + ": Nachricht erhalten: " + msg);
        }
    }
    
    private void sleepRandomly() {
        try {
            sleep(random.nextInt(sleepMax));
        }
        catch (Exception ignore) {}
    }
}