Einführung Verteilte Systeme - Java Threads I - Prof. Dr. Michael Cebulla 20. November 2014 Fachhochschule Schmalkalden Wintersemester 2014/15 1 / 38 M. Cebulla Verteilte Systeme
Gliederung Wiederholung: Chat-Server 1 Wiederholung: Chat-Server 2 Allgemeines Grundkonzepte 3 Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads 4 Probabilistische Approximation von Π Eratosthenes multithreaded 2 / 38 M. Cebulla Verteilte Systeme
Outline Wiederholung: Chat-Server 1 Wiederholung: Chat-Server 2 Allgemeines Grundkonzepte 3 Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads 4 Probabilistische Approximation von Π Eratosthenes multithreaded 3 / 38 M. Cebulla Verteilte Systeme
Chat-Server II 4 / 38 M. Cebulla Verteilte Systeme
Chat-Server III 5 / 38 M. Cebulla Verteilte Systeme
Chat-Server IV 6 / 38 M. Cebulla Verteilte Systeme
Chat-Server V 7 / 38 M. Cebulla Verteilte Systeme
Chat-Server VI 8 / 38 M. Cebulla Verteilte Systeme
Chat-Client I Wiederholung: Chat-Server 9 / 38 M. Cebulla Verteilte Systeme
Chat-Client II 10 / 38 M. Cebulla Verteilte Systeme
Chat-Client III 11 / 38 M. Cebulla Verteilte Systeme
Chat-Client IV 12 / 38 M. Cebulla Verteilte Systeme
Chat-Client V 13 / 38 M. Cebulla Verteilte Systeme
Outline Wiederholung: Chat-Server Allgemeines Grundkonzepte 1 Wiederholung: Chat-Server 2 Allgemeines Grundkonzepte 3 Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads 4 Probabilistische Approximation von Π Eratosthenes multithreaded 14 / 38 M. Cebulla Verteilte Systeme
Allgemeines Grundkonzepte Im Allgemeinen wird unter Programmierung die Entwicklung sequentieller Programme verstanden. Das Verhalten eines Programms wird mit der festgelegten Abarbeitung von Programmschritten in einer determinierten Reihenfolge gleichgesetzt. Dies ist spätenstens seit der Verbreitung von Multicore-Prozessoren nicht mehr zutreffend. Heutzutage ist die von Programmen der Standardfall. Jeder Programmierer muss sich mit den entsprechenden Herausforderungen und Programmierkonzepten auseinandersetzen. 15 / 38 M. Cebulla Verteilte Systeme
Allgemeines Grundkonzepte Java Support für Multithreading High-level APIs in java.util.concurrent. Nativer Support für in der Laufzeitumgebung 16 / 38 M. Cebulla Verteilte Systeme
Prozesse und Threads I Allgemeines Grundkonzepte Prozess besitzt eine konsistente Ausführungsumgebung, die vom Betriebssystem verwaltet wird. Das Betriebssystem weist dem Prozess Ressourcen (z.b. Speicherplatz, Prozessoren) zu. Häufig wird ein Programm mit einem Prozess gleichgesetzt. In Java entspricht eine VM i.d.r. einem Prozess 17 / 38 M. Cebulla Verteilte Systeme
Prozesse und Threads II Allgemeines Grundkonzepte Thread Lightweight Process. Ein Prozess enthält einen oder mehrere Threads. Threads teilen sich die Ressourcen eines Prozesses. Man unterscheidet zwischen System- und User-Threads. Java- bestehen aus mehreren (System-)Threads, die dem Programmierer in der Regel unzugänglich sind. Zu Beginn gibt es jedoch nur einen User-Thread, der die Fähigkeit hat, neue Threads zu erzeugen. 18 / 38 M. Cebulla Verteilte Systeme
Time-Sharing vs. Multicore Allgemeines Grundkonzepte 19 / 38 M. Cebulla Verteilte Systeme
Outline Wiederholung: Chat-Server Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads 1 Wiederholung: Chat-Server 2 Allgemeines Grundkonzepte 3 Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads 4 Probabilistische Approximation von Π Eratosthenes multithreaded 20 / 38 M. Cebulla Verteilte Systeme
Threads als Objekte Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads Threads fügen sich als Objekte in das OOP-Paradigma von Java ein. Jeder Thread ist mit einem Thread-Objekt verbunden, das es gestattet, ihn zu steuern. Aus der Klasse Thread wird ein Objekt erzeugt, dass es erlaubt, asynchrone Aufgaben zu erledigen. 21 / 38 M. Cebulla Verteilte Systeme
Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads Erzeugung eines Threads - Klasse vs. Interface Eine Thread-Klasse enthält den Programm-Code der vom Thread nebenläufig auszuführen ist. Erben von der Klasse Thread public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); } public static void main(string args[]) { (new HelloThread()).start(); } } Vererbung: Einfach zu Handhaben - dafür eingeschränkter: Java kennt keine Mehrfachvererbung. 22 / 38 M. Cebulla Verteilte Systeme
Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads Erzeugung eines Threads - Interface Implementierung des Interface Runnable public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(string args[]) { (new Thread(new HelloRunnable())).start(); } } Allgemeiner: Die Klasse kann auch von anderen Klassen abgeleitet werden. Die Task (Runnable) wird vom Thread getrennt. 23 / 38 M. Cebulla Verteilte Systeme
Lifecycles eines Threads Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads 24 / 38 M. Cebulla Verteilte Systeme
Pausieren mit Thread.sleep() Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads Thread.sleep() Der Aufruf von sleep() hält die Ausführung eines Threads an. Die InterruptedException wird geworfen, wenn die Sleep-Phase durch einen anderen Thread unterbrochen wird. Es ist nicht garantiert, dass die Zeit von sleep exakt eingehalten wird. public class SleepMessages { public static void main(string args[]) throws InterruptedException { for (int i = 0; i < 100; i++) { Thread.sleep(4000); System.out.println("Sleep " + i); } } 25 / 38 M. Cebulla Verteilte Systeme
Interrupts Wiederholung: Chat-Server Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads Interrupts Interrupts stellen eine Aufforderung zur Unterbrechung der Ausführung eines Threads dar. Sie werden von anderen Threads ausgelöst und müssen durch die Implementierung des Threads unterstützt werden. Der Aufruf von interrupt setzt das interrupt-flag. } } for (int i = 0; i < 100; i++) { try { Thread.sleep(4000); } catch (InterruptedException e){ return; } System.out.println("Sleep " + i); } 26 / 38 M. Cebulla Verteilte Systeme
Verwendung von interrupted Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads for (int i = 0; i < inputs.length; i++) { heavycrunch(inputs[i]); if (Thread.interrupted()) { return; } } 27 / 38 M. Cebulla Verteilte Systeme
Joins Wiederholung: Chat-Server Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads Joins Mit Hilfe des join-statments ist es möglich, dass ein Thread wartet, bis ein anderer seine Arbeit beendet hat. t.join(); 28 / 38 M. Cebulla Verteilte Systeme
Beispiel: Simple Threads Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads Das Beispiel zeigt, wie zwei Threads miteinander kommunizieren: Den Haupt-Thread, der in jedem Programm vorhanden ist. Einen Unter-Thread, der vom Haupt-Thread erzeugt und gesteuert wird. 29 / 38 M. Cebulla Verteilte Systeme
Simple Thread: der Unter-Thread Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads try { for (int i = 0; i < importantinfo.length; i++) { Thread.sleep(4000); threadmessage(importantinfo[i]); } } catch (InterruptedException e) { threadmessage("i wasn t done!"); } 30 / 38 M. Cebulla Verteilte Systeme
Simple Thread: der Haupt-Thread Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads long starttime = System.currentTimeMillis(); Thread t = new Thread(new MessageLoop()); t.start(); while (t.isalive()) { if (((System.currentTimeMillis() - starttime) > patience) && t.isalive()) { threadmessage("tired of waiting!"); t.interrupt(); t.join(); } } threadmessage("finally!"); 31 / 38 M. Cebulla Verteilte Systeme
Outline Wiederholung: Chat-Server Probabilistische Approximation von Π Eratosthenes multithreaded 1 Wiederholung: Chat-Server 2 Allgemeines Grundkonzepte 3 Erzeugung von Threads Methoden zur Steuerung von Threads Ein Beispiel: Simple Threads 4 Probabilistische Approximation von Π Eratosthenes multithreaded 32 / 38 M. Cebulla Verteilte Systeme
Ansatz Wiederholung: Chat-Server Probabilistische Approximation von Π Eratosthenes multithreaded Ein Viertelkreis mit radius 1 hat die Fläche π 4. Ein Quadrat mit der Seitenlänge 1 hat die Fläche 1. Bei Gleichverteilung ist die Wahrscheinlichkeit, dass ein zufällig gewählter Punkt im Viertelkreis liegt, π 4. Bei einer hohen Zahl von Versuchen ist die Anzahl der Punkte im Viertelkreis geteilt durch die Gesamtzahl eine Approximation an π 4. 33 / 38 M. Cebulla Verteilte Systeme
Ansatz 2 Wiederholung: Chat-Server Probabilistische Approximation von Π Eratosthenes multithreaded Die Kreislinie wird beschrieben durch die Gleichung x 2 + y 2 = 1 Zufällig ausgewählte Punkte mit x 2 + y 2 < 1 liegen im Viertelkreis 34 / 38 M. Cebulla Verteilte Systeme
Die run-methode Probabilistische Approximation von Π Eratosthenes multithreaded 35 / 38 M. Cebulla Verteilte Systeme
Thread-Steuerung Probabilistische Approximation von Π Eratosthenes multithreaded 36 / 38 M. Cebulla Verteilte Systeme
Sieve-Thread Probabilistische Approximation von Π Eratosthenes multithreaded 37 / 38 M. Cebulla Verteilte Systeme
Ausblick Wiederholung: Chat-Server Probabilistische Approximation von Π Eratosthenes multithreaded Konzepte zur Erzeugung und Steuerung von Threads Demnächst: Synchronisation von Threads Weitergehende Konzepte für Java-Threads 38 / 38 M. Cebulla Verteilte Systeme