package javacodebook.thread.simplerunnable;

import java.util.Random;

/**
 * Eine Klasse, die das Interface Runnable implementiert und damit dazu
 * genutzt werden kann, in einem eigenen Thread zu laufen.
 *
 * @author Mark Donnermeyer
 */
public class SimpleRunnable implements Runnable {
    private static Random random = new Random(System.currentTimeMillis());
    
    public void run() {
        // Der aktuelle Thread wird ermittelt.
        Thread myThread = Thread.currentThread();
        
        // Der Thread zeigt 10 mal an, dass er lebt und legt sich zwischendurch
        // für eine zufällige Zeit zwischen 0 und 1 Sekunde schlafen.
        for (int i=0; i<10; i++) {
            // Es geht auch ohne sleep. Mit sleep läßt sich das Geschehen aber
            // besser verfolgen.
            try {
                Thread.sleep(random.nextInt(1000));
            }
            catch (InterruptedException e) {}
            
            // Ein Lebenszeichen des Thread. Damit auch sicher ist, dass die
            // Ausgaben dann erscheinen, wenn sie produziert werden, wird
            // die Methode flush() aufgerufen.
            System.out.println(myThread.getName() + ": " + i );
            System.out.flush();
        }
        System.out.println(myThread.getName() + ": fertig");
    }
    
    public static void main(String []args) {
        // Es werden zwei Objekte der Klasse SimpleRunnable erzeugt. Da sie
        // keine Threads sind, sondern 'nur' die Klasse Runnable implementieren,
        // müssen sie jeweils von einem Thread 'huckepack' genommen werden.
        SimpleRunnable r1 = new SimpleRunnable();
        SimpleRunnable r2 = new SimpleRunnable();
        Thread s1 = new Thread(r1, "Anton");
        Thread s2 = new Thread(r2, "Berta");
        
        // Jetzt gehts los. Die Threads werden gestartet.
        s1.start();
        s2.start();
        System.out.println("Main: fertig");
    }
}