Wirtschaftsinformatik II Sommersemester Lo sungshinweise zu den Ü bungen P. Mandl, M. Dolag, B. Rottmüller, et al.

Ähnliche Dokumente
Javakurs für Fortgeschrittene

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

Nebenläufigkeit mit Java

Praktikum aus Softwareentwicklung 2, Stunde 5

Testen nebenläufiger Objekte

Nebenläufigkeit mit Java

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

Parallele Prozesse. Prozeß wartet

Wintersemester 2009/10 Helmut Seidl Institut für Informatik TU München

Informatik B. Vorlesung 8 Synchronisierung von Threads. Dr. Ralf Kunze

PROG 2: Einführung in die Programmierung für Wirtschaftsinformatiker

Liste Programmieren Java Überblick

Lebenszyklus von Threads

Info B VL 17: Deadlocks

parallele Prozesse auf sequenziellen Prozessoren Ein Process ist ein typisches Programm, mit eigenem Addressraum im Speicher.

Objektorientierte Programmierung

Laborskript Verteilte Systeme

Prozesszustände (1a)

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

Vorlesung Informatik II

Softwaretechnik 1 Übung 5

Ausnahmebehandlung in Java

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

(b.) Welche Möglichkeit gibt es, die Methode run so zu verändern, dass Bora Bora IMMER zuletzt ausgegeben wird?

Prozesse. Prozesse sind Programme. Prozesse können aus Unterprozessen bestehen. Prozesshierarchie Unterprozesse Threads

Java Threads. von Gerhart Mende und Awad Fuad. Fuad Awad & Gerhart Mende ProSeminar parallele Programmierung 1

Java I Vorlesung Nebenläufigkeit

Informatik B - Objektorientierte Programmierung in Java. Vorlesung 21: Threads 2. Inhalt

Übung zu Grundlagen der Betriebssysteme. 10. Übung

Threading. Arthur Zaczek. Aug 2015

Nebenläufigkeit mit Java

Dr. Monika Meiler. Inhalt

Philipp Güttler Progwerkstatt Letzte Änderung: Enums, Interfaces, Generics und Threads

Nebenläufige Programmierung in Java: Threads

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

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

Einführung Verteilte Systeme - Java Threads I -

Synchronisation in Java. Invisible Web

Vorlesung Informatik II

Beispiel für überladene Methode

8.6 Visualisierung der Sortieralgorithmen

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

Informatik II. Semesterklausur

Programmieren II. Nebenläufigkeit. Vorlesung 9. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester Threads. Kritische Bereiche

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Prozesse und Threads. Saalübung Informatik II SS Threads erzeugen. Prozesse und Threads. Threads, Monitore und Semaphore

Institut fu r Informatik

OOP: Nebenläufigkeiten Threads. Dipl.-Inform. Arnold Willemer

Nebenläufigkeit in Java. Prof. Dr. Margarita Esponda

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

Java Concurrency Utilities

Übung 8: Semaphore in Java (eigene Implementierung)

Parallele und verteilte Anwendungen in Java

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Beteiligte Typen (Auszug)

Info B VL 16: Monitore und Semaphoren

Remote Method Invocation

Einstieg in die Informatik mit Java

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

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Überblick. Verteilte Systeme - Übung. Was ist ein Thread? Threads in Java. Multithreading in Java Threads Synchronisation Koordinierung

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Einführung in die Informatik 1

5. Threads, Serverprozesse und Benachrichtigungen

Muster nebenläufiger Programmierung. concurrent Packet von Java. Alois Schü;e AOSD 1

Objektorientierte Programmierung OOP Objektorientierte Programmierung (OOP) mit Java

Programmierung mit Threads in Java

Aufgabenblatt 8 Musterlösung

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

Einführung in die Programmierung Blockkurs Java

Nebenläufige Anwendungen in Java (J2SE, Rich Client, J2EE)

2.2 Prozesse in Java

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

Klausur Software-Entwicklung September 00

Aufgabe 9 Threads [12]

Einführung Verteilte Systeme - Java Threads III -

Klausurvorbereitung VS1 (Prof. Brecht) (B0rg Edition)

Threads in Java und Android

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

Java Real-Time Specification

Ausgewählte Implementierungsprobleme

Lehrstuhl für Bioinformatik Einführung in die Programmierung für Bioinformatiker Prof. B. Rost, Dr. L. Richter Blatt

Betriebssysteme. G: Parallele Prozesse. (Teil B: Klassische Problemstellungen, Mutual Exclusion, kritische Regionen)

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Remote Method Invocation

Javakurs für Anfänger

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

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Einführung in die Programmierung für Nebenfach Medieninformatik. Beat Rossmy, Michael Kirsch

1.7 Fehler- und Ausnahmebehandlung

Threads - Klausuraufgaben

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

Einführung in die Programmierung für Nebenfach Medieninformatik. Beat Rossmy, Michael Kirsch

Transkript:

Wirtschaftsinformatik II Sommersemester 2016 Lo sungshinweise zu den Ü bungen 2-6 @Prof. P. Mandl, M. Dolag, B. Rottmüller, et al. Seite 1 / 6

Übung 2 Verwendung von Java-Threads Ableitung von Klasse Thread public class MyThread extends Thread o Threaderzeugung und Starten private MyThread mythread = new MyThread(); mythread.start(); Implementierung Interface Runnable public class MyRunnable implements Runnable o Threaderzeugung und starten des Threads private MyRunnable myrunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); Java unterstützt keine Mehrfachvererbung. Eine Klasse kann jedoch beliebig viele Interfaces implementieren. Daher kann bei der Interface-Methode zusätzlich noch Vererbung eingesetzt werden. Der Aufruf von run() erzeugt keinen neuen Thread, sondern wird wie ein normaler Methoden-Aufruf abgehandelt. Ein neuer Thread muss explizit mit Aufruf von start() zum Ablauf gebracht werden. Vorteil der Interface-Variante: Java unterstützt keine Mehrfachvererbung. Nutzt man das Runnable-Interface, ist noch die Möglichkeit gegeben, von einer anderen Klassen zu erben. @Prof. P. Mandl, M. Dolag, B. Rottmüller, et al. Seite 2 / 6

Übung 3 Synchronisation von Java Threads Das Programm startet zuerst drei Threads die ohne Synchronisation auf ein CounterObject zugreifen und dieses mit jedem Zugriff um 1 erhöhen. Anschließend wird das gleiche mit Synchronisation (=Definition eines kritischen Abschnitts) vollzogen. Die Deklaration eines Abschnittes mit dem Schlüsselwort synchronized ist relativ teuer, kostet also viel CPU-Zeit. Dadurch benötigt der Ablauf der synchronisierten Threads bedeutend mehr Zeit. Die Threadanzahl verändert sich im Laufe der Verarbeitung. Einige Threads sind bei jedem Java-Prozess vorhanden, die Threads sind JVM-spezifisch. Darunter sind beispielsweise der Garbage-Collector und einige weitere System-Threads zu finden. Das Erzeugen, Starten und Joinen von Threads kann mittels eines Arrays und mit Schleifen wie folgt realisiert werden: private final int MAX_THREADS = 10; Thread[] threadarray = new Thread[MAX_THREADS]; for (int i = 0; i < maxthread; i++) { threadarray[i] = new CountThread1(c, maxcount); threadarray[i].start(); try { for (int i = 0; i < MAX_THREADS; i++) { threadarray[i].join(); catch (Exception e) { e.printstacktrace(); oder so: try { for(thread p : threadarray){ p.join(); catch (Exception e) { e.printstacktrace(); Der join()-aufruf muss in einer separaten Schleife stattfinden, da sonst direkt nach dem Start eines Threads auf dessen Ende gewartet wird, bevor ein neuer Thread gestartet wird Zeitmessung o Start/Stop-Zeit ermitteln private long [begin end] = System.currentTimeMillis(); o Vergangene Zeit (in Millisekunden) = end begin; Prioritäten o JVM-Prioritäten: eine Zahl zwischen Thread.MIN_PRIORITY (1) und Thread.MAX_PRIORITY (10). Dies sind Konstanten aus der Klasse Thread. Standardmäßig wird die Thread.NORM_PRIORITY (5) vergeben. o Windows-Prioritäten: Es können über den Taskmanager 6 Prioritäten zugewiesen werden. Standardmäßig wird Priorität NORMAL (8) verwendet @Prof. P. Mandl, M. Dolag, B. Rottmüller, et al. Seite 3 / 6

Übung 4 - Producer-Consumer-Problem in Java Die Ausgaben entsprechen nicht dem tatsächlichen Programmablauf, da sie nicht an sinnvollen Stellen ausprogrammiert sind. Anhand der Ausgaben könnte der Verdacht entstehen, dass der MessageBuffer mit zwei Nachrichten belegt wird, was aber aufgrund des Quellcodes nicht möglich ist (der produzierende Thread wird zu diesem Zweck mit der wait()-methode aufgehalten. Es werden mehr Nachrichten produziert als konsumiert. In der hier vorgestellten Lösung liest ein Consumer-Thread (in nachfolgendem Beispiel der letzte Thread) die restlichen Nachrichten aus und konsumiert diese: final int AMOUNT_PRODUCER = 3; final int AMOUNT_CONSUMER = 2; int producerloops = 11; int messagecount = producerloops * AMOUNT_PRODUCER; int consumerloops = messagecount/amount_producer; MessageProducer[] arrayprod = new MessageProducer[AMOUNT_PRODUCER]; MessageConsumer[] arraycon = new MessageConsumer[AMOUNT_CONSUMER]; for(int i=0; i< AMOUNT_PRODUCER;i++){ arrayprod[i] = new MessageProducer(producerLoops); for(int i=0; i< AMOUNT_CONSUMER;i++){ if(i == (AMOUNT_CONSUMER - 1)) { arraycon[i] = new MessageConsumer(consumerLoops + messagecount% AMOUNT_CONSUMER); else { arraycon[i] = new MessageConsumer(consumerLoops); notify() weckt einen beliebigen Thread auf, wobei es zu einem Deadlock kommen kann. Der aufgeweckte Thread könnte nämlich ein Producer sein, obwohl ein Consumer benötigt würde oder umgekehrt. notifyall() hingegen weckt alle Threads auf. Alle erhalten irgendwann eine CPU und arbeiten nach dem wait()-aufruf weiter. Ein richtiger Thread ist dann auf alle Fälle dabei. Ein Deadlock wird somit verhindert. @Prof. P. Mandl, M. Dolag, B. Rottmüller, et al. Seite 4 / 6

Übung 5 - Semaphore in Java (Eigenimplementierung) Es handelt sich nicht um eine faire Lösung. Es kann also vorkommen, dass ein Thread länger wartet als ein anderer. Es ist nicht gesichert, dass die Thread-Warteschlange nach FIFO abgearbeitet wird. Weiterhin kann keine genaue Vorhersage getroffen werden, welcher Thread als nächstes an die Reihe kommt, da die CPU-Scheduling-Mechanismen nicht deterministisch sind. So hat jeder Programmablauf eine unterschiedliche Reihenfolge beim Abarbeiten der Threads. @Prof. P. Mandl, M. Dolag, B. Rottmüller, et al. Seite 5 / 6

Übung 6 - Semaphore in Java (Standardklasse) In einem kritischen Abschnitt sollte grundsätzlich (es gibt auch andere Anwendungsszenarien) lediglich ein Thread arbeiten, um die hier gegebenen Synchronisationsprobleme zu vermeiden. Daher muss der Semaphorzähler auf 1 initialisiert werden. Das Programm kann um geeignete System.out.println-Ausgaben vor semaphore.acquire(), vor semaphore.release() und im kritischen Abschnitt erweitert werden. Anschließend kann in der Ausgabe gezählt werden, welcher Thread zuerst wartet und welcher danach den kritischen Abschnitt betritt. Die Fairness-Eigenschaft kann dem Semaphor bei der Erzeugung übergeben werden. Dazu muss der Konstruktur Semaphore(int permits, boolean fair) verwendet werden. Abgefragt werden kann dies über die Semaphore-Methode isfair(). Fair bedeutet hier, dass der zuerst wartende Thread auch zuerst abgearbeitet wird (FIFO-Prinzip der Warteschlange). Ab einer gewissen Thread-Anzahl (abhängig vom der virtuellen Maschine zugewiesenen Speicher wird beim Starten dieser eine OutOfMemory-Exception geworfen, welche geeignet abgefangen werden muss. Wann der Speicher genau ausgeht, hängt von der Systemkonfiguration und den Einstellungen in der JVM ab. Die Heap-Speichergröße kann beim Aufruf eines Java-Programms mit Optionen verändert werden. Eine OutOfMemoryError-Exception kann abgefangen werden. Im catch-block kann das Programm mit einer Fehlermeldung und mit System.exit(0) ordnungsgemäß beendet werden. @Prof. P. Mandl, M. Dolag, B. Rottmüller, et al. Seite 6 / 6