From 0cda89930a26b696713255b927a2da3e617bfdd7 Mon Sep 17 00:00:00 2001 From: stedS <sven.steddin@reutlingen-university.de> Date: Tue, 26 Jan 2021 00:54:03 +0100 Subject: [PATCH] Zusaetzliches Beispiel zum Thema Circular Wait / Deadlock --- VL04_09/ThreadDeadlock/.classpath | 6 ++++ VL04_09/ThreadDeadlock/.gitignore | 1 + VL04_09/ThreadDeadlock/.project | 17 +++++++++++ .../.settings/org.eclipse.jdt.core.prefs | 11 +++++++ .../src/inf3/ThreadDeadlock.java | 30 +++++++++++++++++++ .../ThreadDeadlock/src/inf3/Thread_Koch1.java | 25 ++++++++++++++++ .../ThreadDeadlock/src/inf3/Thread_Koch2.java | 25 ++++++++++++++++ 7 files changed, 115 insertions(+) create mode 100644 VL04_09/ThreadDeadlock/.classpath create mode 100644 VL04_09/ThreadDeadlock/.gitignore create mode 100644 VL04_09/ThreadDeadlock/.project create mode 100644 VL04_09/ThreadDeadlock/.settings/org.eclipse.jdt.core.prefs create mode 100644 VL04_09/ThreadDeadlock/src/inf3/ThreadDeadlock.java create mode 100644 VL04_09/ThreadDeadlock/src/inf3/Thread_Koch1.java create mode 100644 VL04_09/ThreadDeadlock/src/inf3/Thread_Koch2.java diff --git a/VL04_09/ThreadDeadlock/.classpath b/VL04_09/ThreadDeadlock/.classpath new file mode 100644 index 0000000..fceb480 --- /dev/null +++ b/VL04_09/ThreadDeadlock/.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/ThreadDeadlock/.gitignore b/VL04_09/ThreadDeadlock/.gitignore new file mode 100644 index 0000000..ae3c172 --- /dev/null +++ b/VL04_09/ThreadDeadlock/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/VL04_09/ThreadDeadlock/.project b/VL04_09/ThreadDeadlock/.project new file mode 100644 index 0000000..6e4548f --- /dev/null +++ b/VL04_09/ThreadDeadlock/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>ThreadDeadlock</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/ThreadDeadlock/.settings/org.eclipse.jdt.core.prefs b/VL04_09/ThreadDeadlock/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/VL04_09/ThreadDeadlock/.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/ThreadDeadlock/src/inf3/ThreadDeadlock.java b/VL04_09/ThreadDeadlock/src/inf3/ThreadDeadlock.java new file mode 100644 index 0000000..1994fdd --- /dev/null +++ b/VL04_09/ThreadDeadlock/src/inf3/ThreadDeadlock.java @@ -0,0 +1,30 @@ +/** Programm zur Demonstration ein Deadlocks + * + * Greifen unterschiedliche Threads auf mehrere gemeinsam genutzte Resourcen zu, dann + * kann dies zu Verklemmungen führen. Durch vorgegebene Reihenfolge beim Zugriff lässt sich + * das Problem beheben. + * + * @author stedS + * @version 2.0 (2021-01-25) + */ +package inf3; +public class ThreadDeadlock { + public static void main(String[] args) { + Object teigschuessel = new Object(); + Object ruehrgeraet = new Object(); + Thread_Koch1 kochA = new Thread_Koch1(teigschuessel, ruehrgeraet); + Thread_Koch2 kochB = new Thread_Koch2(teigschuessel, ruehrgeraet); + //Thread_Koch1 kochB = new Thread_Koch1(teigschuessel, ruehrgeraet); + kochA.start(); + kochB.start(); + try { + kochA.join(); + kochB.join(); + } catch (InterruptedException e) { + System.out.println("join interrupted"); + } + System.out.println("Kuchen fertig"); + } +} + + diff --git a/VL04_09/ThreadDeadlock/src/inf3/Thread_Koch1.java b/VL04_09/ThreadDeadlock/src/inf3/Thread_Koch1.java new file mode 100644 index 0000000..00f9a26 --- /dev/null +++ b/VL04_09/ThreadDeadlock/src/inf3/Thread_Koch1.java @@ -0,0 +1,25 @@ +package inf3; +public class Thread_Koch1 extends Thread { + Object teigschuessel; + Object ruehrgeraet; + Thread_Koch1 (Object teigschuessel, Object ruehrgeraet) { + this.teigschuessel = teigschuessel; + this.ruehrgeraet = ruehrgeraet; + } + + public void run() { + synchronized (teigschuessel) { + System.out.println(this.getName() + " hat Teigschüssel und wartet auf Rührgerät"); + try { + Thread.sleep(200); + } catch (InterruptedException e) { } + synchronized (ruehrgeraet) { + System.out.println(this.getName() + " rührt Teig"); + try { + Thread.sleep(200); + } catch (InterruptedException e) { } + } + } + } +} + diff --git a/VL04_09/ThreadDeadlock/src/inf3/Thread_Koch2.java b/VL04_09/ThreadDeadlock/src/inf3/Thread_Koch2.java new file mode 100644 index 0000000..34ce58a --- /dev/null +++ b/VL04_09/ThreadDeadlock/src/inf3/Thread_Koch2.java @@ -0,0 +1,25 @@ +package inf3; +public class Thread_Koch2 extends Thread { + Object teigschuessel; + Object ruehrgeraet; + Thread_Koch2 (Object teigschuessel, Object ruehrgeraet) { + this.teigschuessel = teigschuessel; + this.ruehrgeraet = ruehrgeraet; + } + + public void run() { + synchronized (ruehrgeraet) { + System.out.println(this.getName() + " hat Rührgerät und wartet auf Teigschüssel"); + try { + Thread.sleep(200); + } catch (InterruptedException e) { } + synchronized (teigschuessel) { + System.out.println(this.getName() + " rührt Teig"); + try { + Thread.sleep(200); + } catch (InterruptedException e) { } + } + } + } +} + -- GitLab