From 1e53e7b61bda1de8cce14fa887ee48f842be7500 Mon Sep 17 00:00:00 2001
From: stedS <sven.steddin@reutlingen-university.de>
Date: Mon, 25 Jan 2021 20:33:05 +0100
Subject: [PATCH] Ergaenzung Beispiele zur Verwendung von Thread Monitoren mit
 wait() und notify()

---
 VL04_09/ThreadsMonitor2/.classpath            |  6 +++
 VL04_09/ThreadsMonitor2/.gitignore            |  1 +
 VL04_09/ThreadsMonitor2/.project              | 17 ++++++++
 .../.settings/org.eclipse.jdt.core.prefs      | 11 +++++
 .../src/inf3/Thread_TextAusgabe.java          | 42 +++++++++++++++++++
 .../src/inf3/ThreadsMonitor2.java             | 33 +++++++++++++++
 6 files changed, 110 insertions(+)
 create mode 100644 VL04_09/ThreadsMonitor2/.classpath
 create mode 100644 VL04_09/ThreadsMonitor2/.gitignore
 create mode 100644 VL04_09/ThreadsMonitor2/.project
 create mode 100644 VL04_09/ThreadsMonitor2/.settings/org.eclipse.jdt.core.prefs
 create mode 100644 VL04_09/ThreadsMonitor2/src/inf3/Thread_TextAusgabe.java
 create mode 100644 VL04_09/ThreadsMonitor2/src/inf3/ThreadsMonitor2.java

diff --git a/VL04_09/ThreadsMonitor2/.classpath b/VL04_09/ThreadsMonitor2/.classpath
new file mode 100644
index 0000000..fceb480
--- /dev/null
+++ b/VL04_09/ThreadsMonitor2/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/VL04_09/ThreadsMonitor2/.gitignore b/VL04_09/ThreadsMonitor2/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/VL04_09/ThreadsMonitor2/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/VL04_09/ThreadsMonitor2/.project b/VL04_09/ThreadsMonitor2/.project
new file mode 100644
index 0000000..df49c09
--- /dev/null
+++ b/VL04_09/ThreadsMonitor2/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ThreadsMonitor2</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/VL04_09/ThreadsMonitor2/.settings/org.eclipse.jdt.core.prefs b/VL04_09/ThreadsMonitor2/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3a21537
--- /dev/null
+++ b/VL04_09/ThreadsMonitor2/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/VL04_09/ThreadsMonitor2/src/inf3/Thread_TextAusgabe.java b/VL04_09/ThreadsMonitor2/src/inf3/Thread_TextAusgabe.java
new file mode 100644
index 0000000..d326d85
--- /dev/null
+++ b/VL04_09/ThreadsMonitor2/src/inf3/Thread_TextAusgabe.java
@@ -0,0 +1,42 @@
+package inf3;
+public class Thread_TextAusgabe extends Thread {
+	char c;
+	Object consoleLock;
+	Thread_TextAusgabe (char c, Object consoleLock) {
+		this.c = c;
+		this.consoleLock = consoleLock;
+	}
+	
+	void SchreibeZeile (char c) {
+		for (int ii=0; ii< 20; ii++) {
+			System.out.print(c + " ");
+			//busy waiting ... keine gute Idee!
+//			for (int ll=0; ll< 1000000; ll++) {
+//				Double kk = Math.sqrt(ll);
+//			}
+			try {
+				Thread.sleep(20);
+			} catch (InterruptedException e) {
+				System.out.println("interrupted while sleeping");
+			}
+		}
+		System.out.println();
+	}
+	
+	public void run() {
+		synchronized (consoleLock) {
+			for (int ii=0; ii<5; ii++) {
+				SchreibeZeile(c);
+				consoleLock.notifyAll();
+				try {
+					consoleLock.wait();
+				} catch (InterruptedException e) {
+					;
+				}
+			}
+			consoleLock.notifyAll();
+		}
+	}
+}
+
+
diff --git a/VL04_09/ThreadsMonitor2/src/inf3/ThreadsMonitor2.java b/VL04_09/ThreadsMonitor2/src/inf3/ThreadsMonitor2.java
new file mode 100644
index 0000000..0fff649
--- /dev/null
+++ b/VL04_09/ThreadsMonitor2/src/inf3/ThreadsMonitor2.java
@@ -0,0 +1,33 @@
+/** 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.  
+ * 
+ * Durch Verwendung der Methoden wait() und notify() zusamen mit 
+ * einem gemeinsam genutzten Lock-Objekt kann erzwungen werden, dass 
+ * sich die Threads bei der Textausgabe abwechseln.
+ * 
+ * @author stedS
+ * @version 1.0 (2021-01-25) 
+ */
+package inf3;
+public class ThreadsMonitor2 {
+	char c;
+	
+	public static void main(String[] args) {
+		Object console = new Object();
+		Thread_TextAusgabe th1 = new Thread_TextAusgabe('1', console);
+		Thread_TextAusgabe th2 = new Thread_TextAusgabe('2', console);
+		th1.start();
+		th2.start();
+		try {
+			th1.join();
+			th2.join();
+		} catch (InterruptedException e) {
+			System.out.println("join interrupted");
+		}
+		System.out.println("Programmende");
+	}
+}
+
+
-- 
GitLab