package javacodebook.thread.pipes;

import java.io.InputStream;
import java.util.Random;

/**
 * Dieser Thread versucht in unregelmäßigen Abständen Zahlen (Bytes) aus der
 * ihm zur Verfügung gestellten Pipe zu lesen und auf der Standardausgabe
 * auszugeben.
 *
 * @author Mark Donnermeyer
 */
class DataSink extends Thread {
    InputStream is;
    Random random;
    
    public DataSink(InputStream is) {
        this.is = is;
        this.random = new Random(System.currentTimeMillis());
    }
    
    public void run() {
        byte[] buf = new byte[1];
        int size = 0;
        
        try {
            // Der Thread läuft solange, bis die Pipe von der anderen Seite
            // geschlossen wird.
            while(true) {
                // Es wird versucht, ein Byte aus der Pipe zu lesen. Der Aufruf
                // wird erst dann abgeschlossen, wenn mind. ein Byte zur
                // Verfügung steht oder die Pipe geschlossen wurde.
                size = is.read(buf, 0, 1);
                
                // In der Pipe stehen keine Daten mehr zur Verfügung.
                if (size < 0)
                    break;
                
                // Das gelesene Byte wird ausgegeben.
                System.out.println("\t\t" + buf[0]);
                sleepRandomly(200, 300);
            }
            System.out.println("\t\tEOF");
            is.close();
        }
        catch (Exception ignore)
        {}
    }
    
    /**
     * Versetzt den Thread in einen Schlaf, der mindestens min und maximal max
     * Millisekunden dauert.
     */
    private void sleepRandomly(int min, int max) {
        try {
            int duration = random.nextInt(max-min);
            sleep(duration+min);
        }
        catch (Exception ignore)
        {}
    }
}

