diff --git a/VL04_09/ThreadsMonitor1/.gitignore b/VL04_09/ThreadsMonitor1/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ae3c1726048cd06b9a143e0376ed46dd9b9a8d53 --- /dev/null +++ b/VL04_09/ThreadsMonitor1/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/VL04_09/ThreadsMonitor1/src/inf3/Thread_TextAusgabe.java b/VL04_09/ThreadsMonitor1/src/inf3/Thread_TextAusgabe.java index a23441237881957513786befc735b187d7b29c50..c10a1fe541912574fa4512f0dafa76f89df71711 100644 --- a/VL04_09/ThreadsMonitor1/src/inf3/Thread_TextAusgabe.java +++ b/VL04_09/ThreadsMonitor1/src/inf3/Thread_TextAusgabe.java @@ -5,9 +5,23 @@ public class Thread_TextAusgabe extends Thread { this.c = c; } + static synchronized void SchreibeZeile (char c) { + //static void SchreibeZeile (char c) { + for (int ii=0; ii< 20; ii++) { + System.out.print(c + " "); + + //Warteschleife: + for (int ll=0; ll< 1000000; ll++) { + Double kk = Math.sqrt(ll); + } + } + System.out.println(); + } + public void run() { for (int ii=0; ii< 5; ii++) { - Ausgabe.SchreibeZeile(c); + SchreibeZeile(c); + //Thread.yield(); } } } diff --git a/VL04_09/ThreadsMonitor1/src/inf3/ThreadsMonitor1.java b/VL04_09/ThreadsMonitor1/src/inf3/ThreadsMonitor1.java index bda5cd56e9dd52d8a64e6930f9ec557a0b3463df..222fdc9b39131850dde8ab25ef355f699b9ffb12 100644 --- a/VL04_09/ThreadsMonitor1/src/inf3/ThreadsMonitor1.java +++ b/VL04_09/ThreadsMonitor1/src/inf3/ThreadsMonitor1.java @@ -1,18 +1,34 @@ /** Programm zur Demonstration der Threadsynchronisation * durch den Einsatz eines Monitors: Zwei Threads sollen * jeweils 10 mal die im Konstruktor übergebene Ziffer in eine - * Zeile schreiben. Erst wenn die Methode SchreibeZeile() gegen + * Zeile schreiben. Erst wenn die Methode SchreibeZeile() gegen * Unterbrechungen gesperrt wird, indem sie mit synchronized er- * weitert wird, erhält man die gewünschte gleichmäßige Ausgabe * der Zahlenwerte. * + * Um sicherzustellen, dass die Ausgabe-Threads auf ein gemeinsames + * Sperrobjekt zugreifen, muss die Methode SchreibeZeile() als static + * deklariert werden. Der Lock steht dann der Klasse Textausgabe nur + * einmal gemeinsam zur Verfügung und wird nicht für jedes instanzierte + * Objekt separat angelegt (in diesem Fall verfehlt er die gewünschte + * Wirkung. + * + * Die Thread-Methode yield() erweist sich als für die Aufgabe untauglich. + * Es ist weder sichergestellt, dass der thread beim Aufruf von yield() + * tatsächlich den running state verlässt, noch, dass ein thread unmittelbar + * nach Verlassen des running Zustandes nicht sofort wieder vom OS + * aktiviert wird. + * + * Die vorgestellte Lösung stellt nun zwar sicher, dass die Ausgabe einer + * Textzeile nicht unterbrochen wird, sie bewirkt jedoch nicht die + * wechselweise Ausgabe der Textzeilen der einzelnen Threads. + * * @author stedS - * @version 1.0 (2016-01-12) + * @version 2.0 (2021-01-25) */ package inf3; public class ThreadsMonitor1 { char c; - public static void main(String[] args) { Thread_TextAusgabe th1 = new Thread_TextAusgabe('1'); Thread_TextAusgabe th2 = new Thread_TextAusgabe('2');