// Datei: Wartegraph.java
// Datum: 19.10.2018
// Autor: Brecht
// Das Programm setzt insgesamt drei Threads, einschließlich
// des main-Threads, ein. Dabei wird jeder der Befehlsfolgen A,
// B, C und D des Wartegraphen durch einen Thread.sleep()-Aufruf
// eine gewisse (experimentell nutzbare) zeitliche Dauer
// gegeben.
// Die Klasse Wartegraph enthält den main-Thread. Er
// instanziiert zwei Klassen namens Thread1 und Thread2, die
// wiederum jeweils einen Thread implementieren. Dem Konstruktor
// der Klasse Thread1 wird eine Referenz auf die gerade erzeugte
// Instanz der Klasse Thread2 übergeben, damit dieser den
// Thread zur Klasse Thread2 starten kann.
// Danach startet der main-Thread den zur Klasse Thread1
// gehörenden Thread und arbeitet selbst die Befehlsfolge A
// ab. Nach derem Ende wartet er auf das Ende der Threadinstanz
// thr1, die unter anderem die Befehlsfolge B abgearbeitet hat.
// Ist dieses Ende erreicht, arbeitet er die Befehlsfolge C ab
// und wartet anschließend auf das Ende des zur Klasse
// Thread2 gehörenden Threads, der die Befehlsfolge D
// abarbeitet.
class Wartegraph {
public static void main(String[] args) throws Exception {
System.out.println("main beginnt");
Thread2 thr2 = new Thread2();
Thread1 thr1 = new Thread1(thr2);
thr1.start();
System.out.println("A beginnt");
Thread.sleep(200);
System.out.println("A endet");
thr1.join();
System.out.println("C beginnt");
Thread.sleep(200);
System.out.println("C endet");
thr2.join();
System.out.println("main endet");
}
}
class Thread2 extends Thread {
public void run() {
System.out.println("D beginnt");
try { Thread.sleep(200); }
catch(Exception e) {}
System.out.println("D endet");
}
}
class Thread1 extends Thread {
Thread2 thr2 = null;
Thread1(Thread2 thr2) {
this.thr2 = thr2;
}
public void run() {
System.out.println("B beginnt");
try { Thread.sleep(200); }
catch(Exception e) {}
System.out.println("B endet");
thr2.start();
}
}