diff --git a/VL04_09/ThreadProgrammende/src/inf3/ThreadProgrammende.java b/VL04_09/ThreadProgrammende/src/inf3/ThreadProgrammende.java index 07cd38c33c5218aaf92268b71905391dc9fdc6b2..c580c0a0281f848d441da36800a71c74be6984ca 100644 --- a/VL04_09/ThreadProgrammende/src/inf3/ThreadProgrammende.java +++ b/VL04_09/ThreadProgrammende/src/inf3/ThreadProgrammende.java @@ -8,22 +8,28 @@ package inf3; * <li> Es zeigt sich, dass das Programm erst dann zu Ende ist, wenn alle * User Threads beendet sind. Erst dann wird der Daemon zerstört. Dies * geschieht hier nicht bereits mit dem Ende von main().</li> +* <li> Obwohl der Daemon Thread unabhängig von der vorgegebenen Anzahl der +* Thread Durchläufe ist, wird er spätestens abgebrochen, wenn der user +* Thread beendet wird (qed).</li> * </ul> * * @author Steddin +* @version 2.00, 2020-01-26 (Steddin) Programm so umgebaut, dass gezeigt wird, +* wie sich das Programm ohne den Aufruf von sleep(500) verhält. * @version 1.01, 2020-01-06 * @version 1.00, 2019-01-18 */ public class ThreadProgrammende { /** Hauptprogramm startet einen Daemon-Thread und 2 User-Thread - * @param args Runntimeparameter werden nicht genützt + * @param args Runtimeparameter werden nicht genützt * @author Sven Steddin */ + public static boolean MIT_SLEEP_AUFRUF = true; public static void main(String[] args) { System.out.println("main-Thread gestartet ..."); - MyThread mythread1 = new MyThread(1); - MyThread mythread2 = new MyThread(2); + MyThread mythread1 = new MyThread(1, 5); + MyThread mythread2 = new MyThread(2, 10); mythread2.setDaemon(true); mythread1.start(); mythread2.start(); @@ -36,24 +42,29 @@ public class ThreadProgrammende { * @author stedS */ class MyThread extends Thread { - int idx; /** Kennnummer des Threads */ - int cnt = 0; /** Anzahl der Aufrufe des Threads */ - MyThread (int idx) { + int idx; /** Kennnummer des Threads */ + int cnt; /** Anzahl der Aufrufe des Threads */ + int maxCnt; /** max. Anzahl der Durchläufe des Threads */ + + MyThread (int idx, int maxCnt) { + super(); + cnt = 0; this. idx = idx; + this.maxCnt = maxCnt; } public void run() { while(true) { String t = this.isDaemon() ? "Daemon" : "Normal"; System.out.println("Thread "+idx+" ["+t+"] : "+ ++cnt +". Durchlauf"); - if (!this.isDaemon() && (cnt>10)) { + if (!this.isDaemon() && (cnt >= maxCnt)) { System.out.println("Thread "+idx+" ["+t+"] : Abbruch"); - System.out.println("Läuft der Daemon weiter?"); break; } - try { - sleep(600); // was passiert, wenn sleep() nicht aufgerufen wird? - // ... lässt sich nicht direkt vorhersagen --> ausprobieren! - } catch (InterruptedException e) { e.printStackTrace(); } + if (ThreadProgrammende.MIT_SLEEP_AUFRUF) { + try { + sleep(500); // was passiert, wenn sleep() nicht aufgerufen wird? + } catch (InterruptedException e) { e.printStackTrace(); } + } } } }