Threads in Java Threads Sprachumfang von Java Der

  • Slides: 11
Download presentation
Threads in Java • Threads Sprachumfang von Java • Der Java-Standard fordert nur die

Threads in Java • Threads Sprachumfang von Java • Der Java-Standard fordert nur die Unterstützung von Thread-Prioritäten. • Es gibt keine Forderung bzgl. : – Verdrängendes/kooperierendes Umschalten – Zeitverteilungsstrategie (Round Robin etc. )

Benutzung von Threads • Spezialisierung der Klasse java. lang. Thread • Implementierung des Interface

Benutzung von Threads • Spezialisierung der Klasse java. lang. Thread • Implementierung des Interface java. lang. Runnable • Thread. start(): Asynchrone nebenläufige Ausführung von run() Class My. Thread 1 extends Thread {. . . public void run() {. . . } Class My. Thread 2 implements Runnable {. . . public void run() {. . . }. . My. Thread 1 mt 1 = new My. Thread 1(); mt 1. start(); My. Thread 2 mt 2 = new Thread thr = new Thread(mt 2); thr. start(); . . .

Synchronisation mit Monitoren • Monitore überwachen kritische Bereiche (KB): – KB ist Teil des

Synchronisation mit Monitoren • Monitore überwachen kritische Bereiche (KB): – KB ist Teil des Programmcodes – Höchstens ein Thread im KB • Ablauf: – Anmeldung des Threads (T) beim Monitor (M) – T blockiert – Wenn KB frei ist Aktivierung von Tdurch M (T belegt M) – Wenn T KB verlässt Signalisierung an den Monitor (T gibt M frei)

Monitore in Java • Jedes Java-Objekt ist ein Monitor. • Syntax: synchronized (obj) {.

Monitore in Java • Jedes Java-Objekt ist ein Monitor. • Syntax: synchronized (obj) {. . . Kritischer Bereich. . . } • Spezialsyntax für kritische Methodenaufrufe: synchronized Type method(. . . ) {. . . } entspricht Type method(. . . ) { synchronized(this) {. . . } }

Explizite Synchronisation • 3 Methoden zur Freigabe von Monitoren: – wait() Blockierung des Threads

Explizite Synchronisation • 3 Methoden zur Freigabe von Monitoren: – wait() Blockierung des Threads – notify() Deblockierung eines Threads des Monitors – notify. All() Deblockierung aller Threads des Monitors

Lebenszyklus eines Threads (vereinfacht) sleeping interrupt() sleep() start() Scheduler runnable wait(), join() blocked notify(),

Lebenszyklus eines Threads (vereinfacht) sleeping interrupt() sleep() start() Scheduler runnable wait(), join() blocked notify(), Interrupt() Terminierung von run() end running

Beispiel: Producer/Consumer • System besteht aus drei Objekten: – Producer erzeugt regelmäßig Daten, –

Beispiel: Producer/Consumer • System besteht aus drei Objekten: – Producer erzeugt regelmäßig Daten, – Consumer verarbeitet diese Daten. – Datenspeicherung in einem Depot Producer Depot Consumer • Es soll keine Rechenzeit vergeudet werden: – Keine Erzeugung bei vollem Depot. – Keine Consumer-Aktivität ohne Daten • Aber: Nebenläufige Erzeugung/Verarbeitung

Depot class Depot { private int buffer=-1; private boolean empty = true; synchronized int

Depot class Depot { private int buffer=-1; private boolean empty = true; synchronized int get. Content() throws Interrupted. Exception { while( empty) { wait(); } // warte bis gefüllt int res = buffer; empty = true; // kopiere Ergebnis notify(); // signalisiere leeres Depot return res; } synchronized void put. Content( int content) throws Interrupted. Exception { while ( ! empty ) { wait(); } // warte bis Depot leer buffer = content; empty = false; // fülle Depot notify(); // signalisiere volles Depot return; } }

Producer class Producer extends Thread { private Depot my. Depot; Producer( Depot dep) {

Producer class Producer extends Thread { private Depot my. Depot; Producer( Depot dep) { my. Depot = dep; } public void run() Erzeugen der Daten { int i = 0; while( true ) { i++; try { my. Depot. put. Content(i); }Übergeben ans Depot catch( Interrupted. Exception ex ) {} }

Consumer class Consumer extends Thread { private Depot my. Depot; Consumer( Depot dep )

Consumer class Consumer extends Thread { private Depot my. Depot; Consumer( Depot dep ) Holen der Daten { my. Depot = dep; } public void run() { while( true ) { try { int i = my. Depot. get. Content(); } catch (Interrupted. Exception ex) {} System. out. println(i); } } } Verarbeiten der Daten

Zusammenstöpseln package vs 99. ex 1; // hier die vorherigen Klassendefinitionen class Thread. Demo

Zusammenstöpseln package vs 99. ex 1; // hier die vorherigen Klassendefinitionen class Thread. Demo { public static void main(String args[]) { // Konfiguration des Systems Depot dep = new Depot(); Producer prod 1 = new Producer(dep); Consumer con 1 = new Consumer(dep); // Starten des Systems con 1. start(); prod 1. start(); } }