diff --git a/VL04_09/Programmende/.classpath b/VL04_09/Programmende/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..63b7e892d1ebf1eeb9df3d8d71e5bedb134487c1 --- /dev/null +++ b/VL04_09/Programmende/.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/Programmende/.project b/VL04_09/Programmende/.project new file mode 100644 index 0000000000000000000000000000000000000000..08fb4d9dc2f12bf9877934a2d4da428676c645a4 --- /dev/null +++ b/VL04_09/Programmende/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>ThreadProgrammende</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/Programmende/.settings/org.eclipse.jdt.core.prefs b/VL04_09/Programmende/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..bb35fa0a87b032ee9d0b128004c1edbd464f07bf --- /dev/null +++ b/VL04_09/Programmende/.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/Programmende/src/inf3/ThreadProgrammende.java b/VL04_09/Programmende/src/inf3/ThreadProgrammende.java new file mode 100644 index 0000000000000000000000000000000000000000..07cd38c33c5218aaf92268b71905391dc9fdc6b2 --- /dev/null +++ b/VL04_09/Programmende/src/inf3/ThreadProgrammende.java @@ -0,0 +1,59 @@ +package inf3; +/** Programm zur Demonstration des Verhaltens von Vordergrund- und +* Hintergrund-Threads bei Programmende +* +* <ul> +* <li> Es soll gezeigt werden, in welchem Moment der Programmausführung +* der Daemon-Thread automatisch gestoppt wird.</li> +* <li> Es zeigt sich, dass das Programm erst dann zu Ende ist, wenn alle +* User Threads beendet sind. Erst dann wird der Daemon zerstört. Dies +* geschieht hier nicht bereits mit dem Ende von main().</li> +* </ul> +* +* @author Steddin +* @version 1.01, 2020-01-06 +* @version 1.00, 2019-01-18 +*/ +public class ThreadProgrammende { + /** Hauptprogramm startet einen Daemon-Thread und 2 User-Thread + * @param args Runntimeparameter werden nicht genützt + * @author Sven Steddin + */ + + public static void main(String[] args) { + System.out.println("main-Thread gestartet ..."); + MyThread mythread1 = new MyThread(1); + MyThread mythread2 = new MyThread(2); + mythread2.setDaemon(true); + mythread1.start(); + mythread2.start(); + System.out.println("main-Thread beendet (Programmende?)"); + } +} + +/** Thread zeigt unterschiedliches Verhalten, je nachdem, ob er als user thread oder + * als daemon thread erzeugt wird + * @author stedS + */ +class MyThread extends Thread { + int idx; /** Kennnummer des Threads */ + int cnt = 0; /** Anzahl der Aufrufe des Threads */ + MyThread (int idx) { + this. idx = idx; + } + public void run() { + while(true) { + String t = this.isDaemon() ? "Daemon" : "Normal"; + System.out.println("Thread "+idx+" ["+t+"] : "+ ++cnt +". Durchlauf"); + if (!this.isDaemon() && (cnt>10)) { + System.out.println("Thread "+idx+" ["+t+"] : Abbruch"); + System.out.println("Läuft der Daemon weiter?"); + break; + } + try { + sleep(600); // was passiert, wenn sleep() nicht aufgerufen wird? + // ... lässt sich nicht direkt vorhersagen --> ausprobieren! + } catch (InterruptedException e) { e.printStackTrace(); } + } + } +} diff --git a/VL04_09/ThreadDurchVererbung_0/src/MyThreads/ThreadDurchVererbung_0.java b/VL04_09/ThreadDurchVererbung_0/src/MyThreads/ThreadDurchVererbung_0.java index 7680691ab0bc63bbd94e736a3f1d752fa38e8dfb..3a2c016aedc43a3375640ae9bee7d3d80824ec46 100644 --- a/VL04_09/ThreadDurchVererbung_0/src/MyThreads/ThreadDurchVererbung_0.java +++ b/VL04_09/ThreadDurchVererbung_0/src/MyThreads/ThreadDurchVererbung_0.java @@ -16,7 +16,7 @@ public class ThreadDurchVererbung_0 { /** Thread startet weiteren Thread zum Einlesen von Zahlen über die Tastatur und * gibt anschließend Sternchen auf dem Bildschirm aus. * @param args Keine Auswertung von Runtimeparametern - * @author Steddinzur Ausgabe von Sternchen auf dem Display + * @author Steddin */ public static void main(String[] args) { MyThreadClass myThread = new MyThreadClass(); diff --git a/VL04_09/ThreadDurchVererbung_2_Daemon/.classpath b/VL04_09/ThreadDurchVererbung_2_Daemon/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..63b7e892d1ebf1eeb9df3d8d71e5bedb134487c1 --- /dev/null +++ b/VL04_09/ThreadDurchVererbung_2_Daemon/.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/ThreadDurchVererbung_2_Daemon/.project b/VL04_09/ThreadDurchVererbung_2_Daemon/.project new file mode 100644 index 0000000000000000000000000000000000000000..ae81e8fc5b6833664a090714fcc80e331b699ba0 --- /dev/null +++ b/VL04_09/ThreadDurchVererbung_2_Daemon/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>ThreadDurchVererbung_2_Daemon</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/ThreadDurchVererbung_2_Daemon/.settings/org.eclipse.jdt.core.prefs b/VL04_09/ThreadDurchVererbung_2_Daemon/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..bb35fa0a87b032ee9d0b128004c1edbd464f07bf --- /dev/null +++ b/VL04_09/ThreadDurchVererbung_2_Daemon/.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/ThreadDurchVererbung_2_Daemon/src/MyThreads/MyInputClass.java b/VL04_09/ThreadDurchVererbung_2_Daemon/src/MyThreads/MyInputClass.java new file mode 100644 index 0000000000000000000000000000000000000000..6839a9a995895c179c4de75feba18538c013c70a --- /dev/null +++ b/VL04_09/ThreadDurchVererbung_2_Daemon/src/MyThreads/MyInputClass.java @@ -0,0 +1,18 @@ +package MyThreads; +import java.util.Scanner; + +public class MyInputClass extends Thread { + + public void run() { + Scanner myScanner = new Scanner(System.in); + int ii = 0; + while (true) { + ii = myScanner.nextInt(); + System.out.println("\nEingabe: " + ii); + if (ii>999) break; + } + } +} + + + diff --git a/VL04_09/ThreadDurchVererbung_2_Daemon/src/MyThreads/MyOutputClass.java b/VL04_09/ThreadDurchVererbung_2_Daemon/src/MyThreads/MyOutputClass.java new file mode 100644 index 0000000000000000000000000000000000000000..e5fd3d1b6fffa3fe313caab2d80a42cc71b6cc8c --- /dev/null +++ b/VL04_09/ThreadDurchVererbung_2_Daemon/src/MyThreads/MyOutputClass.java @@ -0,0 +1,20 @@ +package MyThreads; + +public class MyOutputClass extends Thread { + private String text; + + MyOutputClass(String text) + { + this.text = text; + } + + public void run() { + long kk = 0; + while (true) { + if (kk++ % 10000000 == 0) { + System.out.println(text + " "); + } + } + } +} + diff --git a/VL04_09/ThreadDurchVererbung_2_Daemon/src/MyThreads/ThreadDurchVererbung_2_Daemon.java b/VL04_09/ThreadDurchVererbung_2_Daemon/src/MyThreads/ThreadDurchVererbung_2_Daemon.java new file mode 100644 index 0000000000000000000000000000000000000000..fa1d44cd175319c41134e12ba6c38986951d96a7 --- /dev/null +++ b/VL04_09/ThreadDurchVererbung_2_Daemon/src/MyThreads/ThreadDurchVererbung_2_Daemon.java @@ -0,0 +1,26 @@ +/** Programm zur Demonstration der Abhängigkeit von Hintergrund Threads + * und Vordergrund-Threads. + * + * @version 1.0 (2017-01-12) + */ +package MyThreads; +public class ThreadDurchVererbung_2_Daemon { + /** Durch Auskommentieren des Befehls zum Setzen von Daemon Threads + * kann das Verhalten des Programms untersucht werden. + * @param args Runntimeparameter nicht genutzt + * @author stedS + */ + public static void main(String[] args) { + MyInputClass myThread1 = new MyInputClass(); + MyOutputClass myThread2 = new MyOutputClass("Hallo"); + MyOutputClass myThread3 = new MyOutputClass("Meti"); + //myThread2.setDaemon(true); + //myThread3.setDaemon(true); + myThread1.start(); + myThread2.start(); + myThread3.start(); + } +} + + +//System.exit(3); //kann verwendet werden, um Programm endgültig abzuschießen \ No newline at end of file