
package javacodebook.thread.syncblock1;

import java.util.Random;

/**
 * Der Thread dient dazu, die Werte in dem Objekt der Klasse Data in 
 * unregelmäßigen Zeitabständen um einen vorgegebenen Wert zu erhöhen. 
 *
 * @author Mark Donnermeyer
 */
class SyncIncThread extends Thread {
    private static Random random = new Random(System.currentTimeMillis());
    
    private Data data;
    private int  inc;

    public SyncIncThread(String name, Data data, int inc) {
        super(name);
        this.data = data;
        this.inc  = inc;
    }

    /**
     * Der aktuell in dem Objekt data stehende Wert wird 5x in unregelmässigen
     * zeitlichen Abständen um den Wert inc erhöht. Vor der Durchführung der
     * Aktion wird versucht, sich auf dem Objekt data zu synchronisieren um zu 
     * verhinden, das mehrere Threads gleichzeitig Daten in dem Objekt 
     * manipulieren können. Auch die 100 ms Schlaf zwischen lesendem und 
     * schreibendem Zugriff ändern daran nichts.
     */
    public void run() {
        for (int i=0; i<5; i++) {
            synchronized ( data) {
                int number = data.get();
                System.out.println(getName() + ": Neuer Wert: " + (number+inc));
                sleepRandomly(100);
                data.set(number+inc);
            }
            sleepRandomly(1000);
        }
    }
    
    /**
     * Legt den Thread für eine zufällige Zeit zwischen 0 und max Millisekunden
     * schlafen.
     */
    private void sleepRandomly(int max) {
        try {
            sleep(random.nextInt(max));
        }
        catch (Exception ignore) {}
    }
}