2.2 Prozesse in Java



Ähnliche Dokumente
Algorithmen und Programmierung IV: Nichtsequentielle Programmierung. Überblick. Thema

Objektorientierte Programmierung

Innere Klassen in Java

SEP 114. Design by Contract

Einführung in die Programmierung Blockkurs Java

Einführung in die Programmierung

Java: Vererbung. Teil 3: super()

Programmieren in Java

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Programmierkurs Java

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

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Einführung in die Java- Programmierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Computeranwendung und Programmierung (CuP)

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

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Typumwandlungen bei Referenztypen

Technische Dokumentation SilentStatistikTool

Software Engineering Interaktionsdiagramme

Einführung in die Programmierung für Wirtschaftsinformatik

Grundlagen von Python

EasyWk DAS Schwimmwettkampfprogramm

3 Objektorientierte Konzepte in Java

5. Threads, Serverprozesse und Benachrichtigungen

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Karten-Freischaltung mit dem UNLOCK MANAGER

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Übungen Programmieren 1 Felix Rohrer. Übungen

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Synchronisation in Java. Invisible Web

2A Basistechniken: Weitere Aufgaben

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Der lokale und verteilte Fall

Vorkurs C++ Programmierung

Übung: Verwendung von Java-Threads

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Prinzipien Objektorientierter Programmierung

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Schritt 1 - Ein Spielfeld

Javakurs 2013 Objektorientierung

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Schieberegler und analoge Anzeigen

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Datensicherung. Beschreibung der Datensicherung

Applet Firewall und Freigabe der Objekte

C# im Vergleich zu Java

4. AuD Tafelübung T-C3

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Version 0.3. Installation von MinGW und Eclipse CDT

5.2 Neue Projekte erstellen

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Was meinen die Leute eigentlich mit: Grexit?

Verteilte Systeme CS5001

Client-Server-Beziehungen

Algorithmen und Datenstrukturen

Zählen von Objekten einer bestimmten Klasse

Java Kurs für Anfänger Einheit 5 Methoden

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Java Einführung Abstrakte Klassen und Interfaces

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kurzanleitung. Toolbox. T_xls_Import

WhiteStarUML Tutorial

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Große Übung Praktische Informatik 1

13. Tutorium zu Programmieren

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Javakurs zu Informatik I. Henning Heitkötter

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Java Einführung Collections

Software Engineering Klassendiagramme Assoziationen

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Einstieg in die Informatik mit Java

Leichte-Sprache-Bilder

Einführung in die Java- Programmierung

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Bitte geben Sie hier den Benutzer cubusadmin und das gleichnamige Passwort ein.

Assoziation und Aggregation

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Einführung in die Programmierung

Grammatiken. Einführung

Wie wird ein Jahreswechsel (vorläufig und endgültig) ausgeführt?

Programmiersprachen und Übersetzer

Kurzanleitung So geht s

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

5. Tutorium zu Programmieren

1. Einführung. 2. Weitere Konten anlegen

Installation OMNIKEY 3121 USB

Bedienungsanleitung. Stand: Copyright 2011 by GEVITAS GmbH

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Backup der Progress Datenbank

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

INSTALLATION DES V-MODELL XT UNTER WINDOWS VISTA

Transkript:

2.2 Prozesse in Java! Java sieht kein Schlüsselwort für Prozesse vor, sondern bestimmte Klassen und Schnittstellen. Mit anderen Worten: der Prozessbegriff wird mit Mitteln der Objektorientierung eingeführt. Bewertung: hübsche Übung in Objektorientierung, aber nicht angenehm für den Benutzer, weil eher implementierungsorientiert als problemorientiert. ALP4 2.2 1

2.2.1 Thread und Runnable Im Paket java.lang befinden sich interface Runnable { public void run(); } "Faden" public class Thread implements Runnable {... public void run() {} // thread activity public void start() {...} // start thread public void join() {...} // wait for thread } Ein Thread-Objekt ist ein Prozess, der durch die Operation start gestartet wird und dann selbsttätig run ausführt... ALP4 2.2 2

... aber da run leer ist, führt man eigene Prozesse so ein: class MyProcess extends Thread {... public void run() { gewünschte Aktivität } } und erzeugt und startet einen Prozeß wie folgt: Thread t = new MyProcess(); t.start(); oder einfach new MyProcess().start(); Eventuelle Parameterübergabe: über Konstruktor ALP4 2.2 3

public class Talkshow { public static void main() { new Say("A").start(); new Say("B").start(); } } class Say extends Thread { String x; public Say(String what) { x = what; } public void run(){ while(true) System.out.print(x); } } Ausgabe: BBBBBBBBBBBBBAAAAABBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB BBBBBBBBBBBBBBBBBBBBAAAAABBBBB AAABBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBAAAABAAABBBBBBBBB ALP4 2.2 4

Alternative Technik über alternativen Thread-Konstruktor public Thread(Runnable r) {...} wie folgt: class MyActivity implements Runnable { public MyActivity(...) {...} public void run() { gewünschte Aktivität } } new Thread(new MyActivity(...)).start(); Vorteil: bessere Entkoppelung zwischen Thread-Klasse und anwendungsspezifischem Code ALP4 2.2 5

Kleine Übung: möglichst komfortable Nachbildung von p = FORK P(arg);... JOIN p; Thread t = new C(arg);... (vgl. SR, 2.1.4 ) t.join(); mit Klasse C statt Prozedur P : ALP4 2.2 6

class C extends Thread { private Parameter par; public C(Parameter par) { this.par = par; start(); } public void run() { Prozessaktivität mit Bezug auf par } } Achtung: Dieser Stil ist riskant, weil bei weiterer Unterklassenbildung start auf einem nicht korrekt initialisierten Objekt ausgeführt werden könnte! ALP4 2.2 7

Programmstart und ende: Nicht explizit erzeugt wird der Urprozess (root process, main thread) Er wird beim Programmstart automatisch erzeugt und führt die Prozedur main aus. Im übrigen ist er ein regulärer Thread wie die anderen auch. Achtung: Durch Bibliotheks-Import kann es auch unsichtbare Hintergrund-Threads geben! Ein Programm wird beendet, wenn System.exit() aufgerufen wird oder wenn alle Threads beendet sind regulär oder durch nicht abgefangene Ausnahmen. ALP4 2.2 8

2.2.2 Wichtige Operationen der Klasse Thread Konstruktoren: public Thread(String name) erzeugt Faden, der run ausführen wird, mit dem angegebenen Namen im Zustand neu (created) public Thread() erzeugt Faden, der run ausführen wird, mit dem Namen "Thread n" im Zustand neu public Thread(Runnable r) erzeugt Faden, der r.run() ausführen wird, mit dem Namen "Thread n" im Zustand neu ALP4 2.2 9

Methoden: public void run() vom Benutzer vorzugebende Aktivität; nach deren Ablauf befindet sich der Faden im Zustand tot / beendet (dead, terminated) public void start() versetzt den Faden vom Zustand neu in den Zustand lebendig (alive), startet Operation run ; Leeroperation, wenn der Faden bereits tot war. throws IllegalThreadStateException wenn der Faden bereits lebendig war public boolean isalive() beantwortet die Frage, ob der Faden lebendig ist (Beachte: die Antwort ist i.a. nichtdeterministisch!) ALP4 2.2 10

public String getname() liefert den Namen des Fadens public void interrupt() setzt ein verborgenes Boolesches Attribut interrupt des Fadens (das nach der Erzeugung des Fadens zunächst false ist) auf true ; der Zustand dieses Attributs kann mit der folgenden Operation abgefragt werden: public boolean isinterrupted() Die einzigen Methoden, mit denen Prozesse direkt aufeinander einwirken können, sind start, join, interrupt ALP4 2.2 11

public final void join() wartet, bis der Faden nicht lebendig (!) ist, d.h. tot oder neu Zustand wartend throws InterruptedException wenn das interrupt-attribut des ausführenden (!) Threads gesetzt ist bzw. während des Wartens gesetzt wird; es wird gelöscht. public final void join(long milliseconds) wie oben aber mit Abbruch bei Überschreitung der angegebenen Wartezeit (timeout) throws InterruptedException wie oben ALP4 2.2 12

Achtung: Es macht keinen Sinn, mit join auf die Beendigung eines Fadens zu warten, der noch gar nicht gestartet wurde. Aus diesem Grund ist es auch riskant, join für einen Faden zu machen, der an durch einen anderen Faden gestartet wurde oder eben auch nicht gestartet wurde! ALP4 2.2 13

Klassenmethoden: public static Thread currentthread() liefert einen Verweis auf den ausführenden Faden (nicht verwechseln mit this!) public static boolean interrupted() beantwortet die Frage, ob das interrupted-attribut des ausführenden (!) Fadens gesetzt ist, und löscht es (!) (Beachte: die Antwort ist i.a. nichtdeterministisch!) ALP4 2.2 14

public static void sleep(long milliseconds) versetzt den ausführenden Thread in den Zustand schlafend (sleeping), aus dem er frühestens nach Ablauf der angegebenen Zeit erlöst wird. throws IllegalArgumentException, bei negativem Argument InterruptedException wie bei join ALP4 2.2 15

Zustandsübergänge im Bild wartend (end of t.run) t.join new neu start aktiv (end of run) tot (wakeup) Thread.sleep schlafend = interrupt lebendig 16

2.2.3 Speichermodell gibt weniger Garantien als es der naiven Vorstellung von der Ausführung eines Programms entspricht, erlaubt damit dem Übersetzer beträchtliche Freiheiten auf raffinierten Rechnerarchitekturen gibt immerhin gewisse Garantien, an die man sich beim Programmieren halten kann/muss ALP4 2.2 17

Einfache Variable (1.2.2 ) sind alle mit Ausnahme von long und double und diese auch, sofern als volatile ( flüchtig ) vereinbart. Sichtbarkeit: Der von einem Faden geänderte Wert einer gemeinsamen Variablen ist für andere Fäden sofort sichtbar, wenn die Variable als volatile vereinbart ist. ALP4 2.2 18

Beachte: (Java-Spezifikation Kap. 17.4 lesen!) Wenn weder volatile noch Synchronisation ( 3) zum Einsatz kommen, ist nicht gesichert, dass Lese- oder Schreibzugriffe auf long- oder double-variable unteilbar sind, die Änderung an einer Variablen von einem anderen Faden aus sofort sichtbar ist, die Änderungen an mehreren Variablen von einem anderen Faden aus in der gleichen Reihenfolge beobachtet werden. ALP4 2.2 19

Beispiele: char tag = * ; double volume = 0.0; volatile long count = 0; volatile String[] s = {...}; tag = ; volume = 3.14; count = 4711; count++; unteilbar, aber u.u. nicht sofort sichtbar nicht unteilbar unteilbar und sofort sichtbar nicht unteilbar (!), aber sofort sichtbar s[0] = "null" unteilbar, aber u.u. nicht sofort sichtbar (!) ALP4 2.2 20