diff --git a/VL04_09/ThreadDeadlock/.classpath b/VL04_09/ThreadDeadlock/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..fceb4801b5ffa0e4a68c2b00441e45bf2eefdbed --- /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 0000000000000000000000000000000000000000..ae3c1726048cd06b9a143e0376ed46dd9b9a8d53 --- /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 0000000000000000000000000000000000000000..6e4548f093cfa723624fff089f638bc0c5dd9b86 --- /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 0000000000000000000000000000000000000000..3a21537071bf4118b9e1ee864cb4bc258aa48211 --- /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 0000000000000000000000000000000000000000..1994fddc0cbe24bfcd7bcf250b2bcf1e1a448f72 --- /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 0000000000000000000000000000000000000000..00f9a26ffd744f59f44218df42116c40241cda11 --- /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 0000000000000000000000000000000000000000..34ce58ad649f8e2ed11cf738473f320d8aa9928d --- /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) { } + } + } + } +} +