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