Java I Vorlesung Nebenläufigkeit

Ähnliche Dokumente
Ausnahmebehandlung in Java

LeJOS: Mindstorms in Java programmieren

Praktikum aus Softwareentwicklung 2, Stunde 5

Java I Vorlesung Generics und Packages

Beispiel für überladene Methode

Parallele Prozesse. Prozeß wartet

Java I Vorlesung 6 Referenz-Datentypen

Synchronisation in Java. Invisible Web

Dr. Monika Meiler. Inhalt

Nebenläufige Programmierung in Java: Threads

Vorlesung Informatik II

Parallele und funktionale Programmierung Wintersemester 2015/ Übung Abgabe bis , 10:00 Uhr

Java I Vorlesung Vererbung und Sichtbarkeit

5. Threads, Serverprozesse und Benachrichtigungen

Funktionale und Objekt-Orientierte Programmierkonzepte

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Ausnahmebehandlung. Ausnahmen werfen (auslösen) Eigene Ausnahmen definieren. Ausnahmen abfangen. Ausnahmen definieren

Soll die Programm-Ausführung nicht beendet werden, muss der Fehler abgefangen werden. NumberFormatException

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Parallele Prozesse Prozeß Parallele Prozesse verzahnte Prozesse Nebenläufige Prozesse: Threads Vorlesung Software-Entwicklung / Folie 131 Ziele:

2.2 Prozesse in Java

Verteilte Systeme CS5001

Geschachtelte Klassen

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Programmierung mit Threads in Java

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Verteilte Systeme - Java Networking (Sockets) 2 -

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober Klausur II

Nebenläufigkeit mit Java

Java Concurrency Utilities

Nebenläufigkeit mit Java

12 Abstrakte Klassen, finale Klassen und Interfaces

Vorname: Nachname: Matrikelnummer: Klausur. Betriebssysteme

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Deklaration einer Klasse Innere innerhalb Klassen einer in Ja anderen v a Klasse

Klausur Software-Entwicklung März 01

1 Klassen anlegen und Objekte erzeugen

1 Klassen anlegen und Objekte erzeugen

Java I Vorlesung 11 Graphische Oberflächen mit Swing

Algorithmen und Datenstrukturen

Threads In dieser Übung beschäftigen wir uns mit der Realisierung von Threads in Java.

Java-Programmierung. Remote Method Invocation - RMI

Verteilte Systeme. 2. Die Client-Server-Beziehung und daraus resultierende Techniken. 2.2 Nebenläufigkeitstechniken in Java

VS4 Slide 1. Verteilte Systeme. Vorlesung 4 vom Dr. Sebastian Iwanowski FH Wedel

Innere Klassen in Java

Einstieg in die Informatik mit Java

Javakurs für Anfänger

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Klausurvorbereitung VS1 (Prof. Brecht) (B0rg Edition)

14 Abstrakte Klassen, finale Klassen, Interfaces

3 Objektorientierte Konzepte in Java

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

II.1.1. Erste Schritte - 1 -

Vorlesung Informatik II

Nebenläufige Programmierung I

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Javakurs für Anfänger

Objektorientierte Programmierung Studiengang Medieninformatik

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Einführung in die Programmierung Blockkurs Java

Einführung Verteilte Systeme - Java Threads III -

Übung zu Grundlagen der Betriebssysteme. 10. Übung

Mobile und Verteilte Datenbanken

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Das Monitorkonzept Brinch-Hansen

1 Abstrakte Klassen, finale Klassen und Interfaces

pue13 January 28, 2017

Thread-Konzept in objektorientierten Programmiersprachen. Threads. Threads in Java

JJ Prozesse und Nebenläufigkeit

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

2 Eine einfache Programmiersprache

Fragen zur OOP in Java

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Einführung in die Informatik 1

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Einführung in die Programmiersprache Java II

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Name: Matrikelnr : Aufgabe 1: (ca. 8 Punkte )

Einführung in die Programmierung Blockkurs Java

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

Java Real-Time Specification

Programmiermethodik 1. Klausur

Geschachtelte Klassen

Universität Karlsruhe (TH)

Threading. Arthur Zaczek. Aug 2015

Zur Erinnerung: Threads. Threadverwaltung. Threads: Prioritäten. Beispiel Flugbuchungsprogramm. Nichtdeterminismus

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Verkettete Datenstrukturen: Listen

Java Einführung Abstrakte Klassen und Interfaces

Remote Method Invocation

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Methoden und Wrapperklassen

FAKULTÄT FÜR INFORMATIK

Mobile und Verteilte Datenbanken

Exceptions und Vererbung

Ausgewählte Implementierungsprobleme

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

Transkript:

Java I Vorlesung 10 Nebenläufigkeit 28.6.2004 Threads Synchronisation Deadlocks Thread-Kommunikation Innere Klassen Anonyme Klassen Nebenläufigkeit http://java.sun.com/docs/books/tutorial/essential/threads/ Manchmal möchte man mehrere Berechnungen gleichzeitig ablaufen lassen: ein Server kommuniziert mit mehreren Clients gleichzeitig Programm führt eine teure Berechnung aus, will aber weiter auf Eingaben reagieren Roboter verarbeitet Sensor-Eingaben Verarbeitung von Klicks auf GUI Konzeptuelle Gleichzeitigkeit von Berechnungen heißt Nebenläufigkeit (concurrency). 2

Sequentielle Verarbeitung Normalerweise werden Programme sequentiell abgearbeitet: Man fängt vorne an, führt einen einzigen Pfad durch das Programm aus, und hört auf. 3 Nebenläufige Verarbeitung Java unterstützt den Ablauf von nebenläufigen Threads: Konzeptionell laufen verschiedene Berechnungen gleichzeitig ab. JVM schaltet natürlich in Wirklichkeit schnell zwischen Threads hin und her (scheduling). Keine Kontrolle über Reihenfolge! 4

Beispiel: Nebenläufigkeit class Primzahlen { static int[] faktorisieren(int zahl) { //... berechne Primfaktoren von zahl...... public static void main(string[] args) { do { int zahl = lieszahl(); int[] prim = faktorisieren(zahl); // TEUER while( zahl > 0 ); 5 Beispiel: Nebenläufigkeit class Primzahlen extends Thread { private int zahl; // vom Konstruktor gesetzt public void run() { int[] prim = faktorisieren(zahl); System.out.println(prim); do { int zahl = lieszahl(); Thread t = new Primzahlen(zahl); t.start(); while( zahl > 0 ); 6

Threads erzeugen Benutzer kann neue Threads anstoßen: Objekt obj von Klasse Thread (oder abgeleiteter) erzeugen Aufruf von obj.start() erzeugt neuen Thread, in dem obj.run() ausgeführt wird. Thread endet, sobald Methode run() verlassen wird. 7 Beispiel: Threads laufen "gleichzeitig" class Counter extends Thread { private String name; // von Konstr. gesetzt... public void run() { for( int i = 1; i <= 20; i++ ) System.err.println(name + ": " + i); new Counter("counter1").start(); new Counter("counter2").start(); 8

Ablauf des Programms Jedes Programm hat einen Main-Thread, in dem die Methode main ausgeführt wird. Dieser Thread endet, sobald main() endet. Benutzer kann neue Threads erzeugen. Programm endet unter einer der beiden folgenden Bedingungen: Aufruf von System.exit() Alle Threads, die keine Dämonen sind (der Default), sind beendet. 9 Synchronisation Manchmal reicht es, wenn man einen Thread einfach anstößt und laufen lässt. Häufig muss man Threads aber synchronisieren: Sicherstellen, dass Daten nicht inkonsistent verändert werden Ein Thread wartet auf Ereignisse aus einem anderen Thread Austausch von Nachrichten 10

Beispiel: Synchronisation nötig class Quadrate { public int zahl, quadratderzahl; public void set(int zahl) { this.zahl = zahl; quadratderzahl = zahl * zahl; class QuadratSetzer extends Thread { public void run() { for( int i = 1; i <= 20; i++ ) q.set(i); Quadrate q = new Quadrate(); new QuadratSetzer(q).start(); int z = q.zahl, qdz = q.quadratderzahl; 11 Beispiel: Synchronisation in Wirklichkeit class InputThread extends Thread { private List<String> queue;... public void run() { String line = somereader.readline(); queue.add(line); List<String> queue = new ArrayList<String>(); new InputThread(queue, somereader1).start(); new InputThread(queue, somereader2).start(); while(queue.size() > 0 ) { String next = queue.iterator().next();... 12

Beispiel: Synchronisation nötig class Quadrate { public int zahl, quadratderzahl; public synchronized void set(int zahl) { this.zahl = zahl; quadratderzahl = zahl * zahl; class QuadratSetzer extends Thread { public void run() { for( int i = 1; i <= 20; i++ ) q.set(i); Quadrate q = new Quadrate(); new QuadratSetzer(q).start(); synchronized(q) { int z = q.zahl, qdz = q.quadratderzahl; 13 Monitore Jedes Objekt besitzt einen eigenen Monitor (oder "mutex"), der zu jedem Zeitpunkt von höchstens einem Thread gehalten werden kann. Mit dem Schlüsselwort synchronized kann ein Thread versuchen, den Monitor eines Objekts zu nehmen. Wenn schon ein anderer Thread den Monitor hält, wird der Thread so lange angehalten, bis der Monitor wieder frei ist. 14

Das Schlüsselwort "synchronized" Ein Block kann mit synchronized umfasst werden: synchronized(obj) {... wird erst ausgeführt, wenn Thread den Monitor von obj hat... Eine Methode kann mit synchronized markiert werden. Dies entspricht Synchronisation auf Objekt bzw. Klassen-Objekt, zu dem Methodenaufruf gehört. 15 Synchronisierte Collections Collections sind aus Effizienzgründen nicht thread-safe, d.h. Methoden sind nicht synchronisiert. Es gibt Methoden in java.util.collections, die synchronisierte Collection-Objekte erzeugen. Iteration muss trotzdem extra synchronisiert werden: Nicht nebenläufig während Iteration neue Einträge einfügen! 16

Beispiel: Synchronisation in Wirklichkeit class InputThread extends Thread { private List<String> queue; public void run() { String line = somereader.readline(); queue.add(line); List<String> queue = Collections.synchronizedList(new ArrayList<String>()); new InputThread(queue, somereader1).start(); new InputThread(queue, somereader2).start(); do synchronized(queue) { for( String str : queue )... // oder wie oben while( queue.size() > 0 ); 17 Deadlocks Jedes nebenläufige Programm ist in ständiger Gefahr, Deadlocks zu enthalten. Deadlock entsteht, wenn zwei Threads zwei Monitore A und B nehmen wollen: Thread 1 nimmt Monitor A Thread 2 nimmt Monitor B Thread 1 kann jetzt B nicht nehmen Thread 2 kann jetzt A nicht nehmen Programm hängt 18

Beispiel: Deadlocks class DeadlockThread extends Thread { private String mon1, mon2; public void run() { synchronized(mon1) { System.err.println("Habe Monitor " + mon1); synchronized(mon2) { System.err.println("Habe Monitor " + mon2); String m1 = "foo", m2 = "bar"; new DeadlockThread(m1, m2).start(); new DeadlockThread(m2, m1).start(); 19 Deadlocks auflösen Beim nebenläufigen Programmieren muss man sorgfältig ausschließen, dass Deadlocks auftreten können. Deadlocks treten nur auf, wenn Threads die Monitore in verschiedener Reihenfolge nehmen wollen. Eine (unter vielen) mögliche Strategie zur Vermeidung: Sicherstellen, dass alle die Monitore in gleicher Reihenfolge nehmen. 20

Wait und Notify Klasse Object definiert die Methoden wait() und notifyall(): Muss Monitor von obj haben, um wait() oder notifyall() aufrufen zu können. Aufruf von obj.wait() gibt Monitor ab und suspendiert den aktuellen Thread Aufruf von obj.notifyall() weckt alle Threads auf, die auf obj suspendiert sind. Threads versuchen als erstes, Monitor wieder zu nehmen. Zweck: Andere Threads über Ereignisse informieren. 21 Beispiel: Wait und Notify Threads 1, 2: try { synchronized(obj) { obj.wait(); catch(interruptedexception e) { Thread 3: synchronized(obj) { obj.notifyall(); 22

Abbrechen von Threads Um einem Thread zu signalisieren, dass er sich beenden soll, ruft man seine interrupt()- Methode auf. Im Thread wird dann eine Exception geworfen: InterruptedException in wait() und sleep(), InterruptedIOException in IO-Methoden. Zustand geändert, so dass Methode isinterrupted() true zurückgibt 23 Pipes Man kann größere Mengen von Daten zwischen Threads über Pipes austauschen. Klassen PipedInput/OutputStream, PipedReader/Writer in java.io. Man erzeugt einen PipedWriter und einen PipedReader als Paar; was man in den einen reinschreibt, kommt aus dem anderen heraus. 24

Verschachtelte Klassen (und Interfaces) Genau wie Felder und Methoden können Klassen und Interfaces Members anderer Klassen sein (statisch oder nichtstatisch). Kann Klassen sogar lokal innerhalb einer Methode deklarieren. Solche Klassen und Interfaces heißen verschachtelt. Verschachtelte Klassen dürfen auf private Members der umschließenden Klasse zugreifen. 25 Innere Klassen Eine Klasse heißt innere Klasse einer anderen, wenn sie ein nichtstatisches Member ist lokal in einer Methode deklariert anonyme Klassen (siehe später) Objekte der inneren Klasse gehören konzeptuell zu Objekten der umfassenden dazu (machen ohne keinen Sinn). Zugriff auf alle Members der äußeren Klasse. 26

Beispiel: Innere Klassen class ManyReaders { private List<String> queue; private class InputThread extends Thread { public void run() { String line = somereader.readline(); queue.add(line); public void foo() { queue = new ArrayList<String>(); new InputThread(someReader1).start(); new InputThread(someReader2).start();... 27 Verschachtelte Klassen: Einschränkungen Innere Klassen dürfen keine statischen Members haben. Statische Member-Klassen dürfen nicht auf nichtstatische Members der umschließenden Klasse zugreifen. Lokale Klassen (in Methoden definiert) dürfen nur auf lokale Variablen zugreifen, die als final definiert sind. 28

Anonyme Klassen Manchmal braucht man nur ein einziges kleines Objekt von einer Klasse; es lohnt sich fast nicht, dafür extra eine Klasse zu definieren. Dafür gibt es anonyme Klassen. In einem einzigen new-ausdruck wird Klasse abgeleitet oder Interface implementiert und dann ein Objekt erzeugt. 29 Beispiel: Anonyme Klassen class ManyReaders { private List<String> queue; public void startthread(bufferedreader reader) { final BufferedReader somereader = reader; Thread rthread = new Thread() { public void run() { String line = somereader.readline(); queue.add(line);.start(); public void foo() { queue = new ArrayList<String>(); startthread(somereader1); startthread(somereader2);... 30

Anonyme Klassen: Syntax Hinter new-ausdruck new C(...) kann in geschweiften Klammern Körper einer Klassendeklaration kommen. Damit wird eine Klasse von C abgeleitet (oder Interface C implementiert), als ob sie diesen Körper hätte. Dann wird Objekt dieser Klasse erzeugt und zurückgegeben. Anonyme Klassen können nur Default- Konstruktoren haben. 31 Anonyme und innere Klassen: Wann? Die meisten Klassen, die man verwendet, sind weder anonym noch innere. Innere Klassen: Klassen, die nur im Kontext einer anderen Klassen Sinn machen. Dann typischerweise private deklarieren. Anonyme Klassen: Nur ein einziger new- Ausdruck für die Klasse im ganzen Programm; wenig Code (max. 10-20 Zeilen). Anonyme Klassen können leicht unübersichtlich werden. 32

Zusammenfassung Nebenläufigkeit (concurrency): Mehrere Threads laufen konzeptuell gleichzeitig ab. Synchronisation: Sicherstellen, dass nur ein Thread gleichzeitig ein Stück Code ausführen kann. Kommunikation zwischen Threads: Wait/Notify, Pipes Verschachtelte, anonyme Klassen. 33

This document was created with Win2PDF available at http://www.daneprairie.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only.