47
Real - Time Java Seminar Asynchrone Ereignisse und Asynchroner Kontrolltransfer in Real - Time Java Sönke Eilers

Sönke Eilers

  • Upload
    tevy

  • View
    33

  • Download
    0

Embed Size (px)

DESCRIPTION

Real - Time Java Seminar Asynchrone Ereignisse und Asynchroner Kontrolltransfer in Real - Time Java. Sönke Eilers. Überblick. Asynchrone Ereignisse ( Async Events ) Behandlungsprozeduren für Asynchrone Ereignisse ( Async Event Handler ) Asynchroner Kontrolltransfer. - PowerPoint PPT Presentation

Citation preview

Page 1: Sönke Eilers

Real - Time Java Seminar

Asynchrone Ereignisse und Asynchroner Kontrolltransfer in Real - Time Java

Sönke Eilers

Page 2: Sönke Eilers

Überblick

• Asynchrone Ereignisse ( Async Events )• Behandlungsprozeduren für Asynchrone

Ereignisse ( Async Event Handler )• Asynchroner Kontrolltransfer

Page 3: Sönke Eilers

Asynchrone Ereignisse - Problematik

• In Realzeit – Systemen treten häufig Ereignisse auf

• Ereignisse treten zu nicht vorhersehbaren Zeitpunkten und in unbekannten Frequenzen auf (asynchron)

• Innerhalb eines Prozesses oder außerhalb (anderer Prozess, OS) eines Prozesses

Page 4: Sönke Eilers

Asynchrone Ereignisse - Anwendungsgebiete

• Ein Prozess soll über einen Fehler in einem anderen Prozess informiert werden

• Innerhalb einer Software soll möglichst schnell und zu nicht vorhersehbaren Zeitpunkten der Betriebsmodus geändert werden ( z.B. ein sicheres Herunterfahren eines Systems im Fehlerfall )

• Um Berechnungen planbar zu machen• Der Benutzer möchte den Prozess unterbrechen

Page 5: Sönke Eilers

Asynchrone Ereignisse

• Behandlung von Ereignissen durch Threads ist zu langsam, weil dem Thread Resourcen zugewiesen werden müssen

• Es sind Mechanismen nötig, um schnell auf asynchrone Ereignisse zu reagieren

• Handler sind in RTSJ ebenso wie Threads planbar, jedoch sind mehrere Handler auf einen Thread angesetzt

Page 6: Sönke Eilers

Asynchrone Ereignisse - Ebenen

A syn ch ro n es E re ign is - E b en e

B eh an d lu n gsp ro zed u ren - E b en e

S chn ittste llen - E bene

Page 7: Sönke Eilers

Asynchrone Ereignisse – Schnittstellen-Ebene

• Die Schnittstellen – Ebene stellt die Verbindung zwischen der Umgebung und der JVM her

• Die Umgebung kann sowohl ein Betriebssystem als auch Hardware sein

• Die JVM wird mittels der Schnittstellen – Ebene über externe Ereignisse ( Happenings ) informiert

Page 8: Sönke Eilers

Asynchrone Ereignisse – Asynchrones Ereignis Ebene

• Objekte der Klasse AsyncEvent werden mit Hilfe der bindTo Methode mit einem externen Ereignis verbunden:AsyncEvent aEvent = new AsyncEvent();aEvent.bindTo(“2“); // 2 ist SIGINT

• Der Schnittstellen – Ebene wird so mitgeteilt, dass dieses externe Ereignis an das Objekt aEvent weitergeleitet wird

• Das AsyncEvent startet die mit dem Ereignis assoziierten Behandlungsprozeduren

Page 9: Sönke Eilers

Asynchrone Ereignisse – Behandlungsprozeduren-Ebene

• Behandlungsprozeduren sind Objekte der Klasse AsyncEventHandler

• AsyncEvent Objekte werden mit den Methoden addHandler und setHandler mit Behandlungsprozeduren verbunden

• removeHandler entfernt den jeweiligen Handler

Page 10: Sönke Eilers

Asynchrone Ereignisse

A syn ch ro n es E re ign is - E b en e

B eh an d lu n gsp ro zed u ren - E b en e

S chn ittste llen - E bene

ex tern es E re ign is

b in d T o ()

ad d H an d ler()

h an d leA syn cE ven t()

Page 11: Sönke Eilers

Asynchrone Ereignisse – Klasse AsyncEvent

A s y n cEv e n t

v o id ad d H an d ler( A s y n cE v en t H an d ler h an d ler)v o id b in d T o ( jav a.lan g.St rin g h ap p en in g)R eleas eP aram et ers creat eR eleas eP aram et ers ()v o id fire()b o o lean h an d led B y ( A s y n cE v en t H an d ler h an d ler)v o id rem o v eH an d ler( A s y n cE v en t H an d ler h an d ler)v o id s et H an d ler( A s y n cE v en t H an d ler h an d ler)v o id u n b in d T o ( jav a.lan g.St rin g h ap p en in g)

Page 12: Sönke Eilers

Asynchrone Ereignisse

1. AsyncEvent event = new AsyncEvent();2. AsyncEventHandler handler = new

AsyncEventHandler()3. // weitere Anweisungen zum Instanzieren von

handler4. // … 5. event.bindTo(“2“);6. event.addHandler( handler );7. event.fire();8. If ( event.handledBy( handler )9. {10. event.removeHandler( handler );11. }12. event.unbindTo(„2“);

Page 13: Sönke Eilers

Asynchrone Ereignisse - Assoziation

• Ein Ereignis kann durch mehrere Behandlungsprozeduren behandelt werden

• Mehrere Ereignisse können von der gleichen Behandlungsprozedur behandelt werden – Handler weiß jedoch nicht, welches Ereignis ihn aufgerufen hat

A sy n cE v en t A s yn cE v en tHan d ler1 . . .* 1 . . .*

Page 14: Sönke Eilers

Asynchrone Ereignisse – Behandlungsprozeduren-Ebene

• Wenn ein Ereignis auftritt, werden alle mit dem Ereignis verbundenen Behandlungsprozeduren gestartet

• Im AEH wird durch das Ereignis die run Methode ausgeführt, die für jedes Auftreten des Ereignis die Methode handleAsyncEvent aufruft

Page 15: Sönke Eilers

Asynchrone Ereignisse – Klasse AsyncEventHandler

A s y n cEv e n tH a n dle r

p ro t ect ed in t get A n d C learP en d in gF ireC o u n t ()p ro t ect ed in t get A n d D ecrem en t P en d in gF ireC o u n t ()p ro t ect ed in t get A n d In crem en t P en d in gF ireC o u n t ()v o id h an d leA s y n cEv en t ()v o id ru n ()

Page 16: Sönke Eilers

Asynchrone Ereignisse – Klasse AsyncEventHandler

AsyncEventHandler handler = new AsyncEventHandler(){

public void handleAsyncEvent(){

System.out.println(“Im Handler!“);

}

};

Page 17: Sönke Eilers

Asynchrone Ereignisse – Klasse AsyncEventHandler

AsyncEventHandler handler = new AsyncEventHandler(){

public void handleAsyncEvent(){

int pending;

do{

System.out.println(“Im Handler!“);

} while ( (pending = getAndDecrementPendingFireCount()) > 0 );

}

};

Page 18: Sönke Eilers

Asynchrone Ereignisse – Klasse AsyncEventHandler

AsyncEventHandler handler = new AsyncEventHandler(){

public void handleAsyncEvent(){

int fireCount = getAndClearPendingFireCount();

System.out.println(“Im Handler!“);

}

};

Das Ereignis ist mehrmals aufgetreten, soll aber nur einmal behandelt werden

Page 19: Sönke Eilers

Asynchrone Ereignisse - Klassendiagramm

• AsyncEventHandler implementiert die beiden Interfaces java.lang.Runnable und java.lang.Schedulable

• BoundAsyncEventHandler erbt von AsyncEventHandler

• Objekte der Klasse AsyncEventHandler sind planbar

< < I n te rfa ce > >R u n n a ble

< < I n te rfa ce > >S ch e du la ble

A s y n cEv e n tH a n dle r

B ou n dAsyn cEve n tH an dl e r

O bje ct

Page 20: Sönke Eilers

Threads vs. AEHs

Threads warten und schlafen

AEHs sind blockiert, oder werden ausgeführt

Threads können lange laufen

AEHs sollen meist nur wenig Code ausführen und beenden

Threads müssen unter Umständen auf Resourcen warten

AEHs sollen so bald wie möglich ausgeführt werden

Page 21: Sönke Eilers

Asynchrone Ereignisse - Implementierung von Asynchronous Event Handler

• Die Referenz – Implementierung von RTSJ erzeugt für jeden AEH einen Thread, wenn ein Ereignis aufgetreten ist

• Schlechte Leistung der Implementierung• Verbesserung: für jeden AEH wird ein Thread

erzeugt

Page 22: Sönke Eilers

Asynchrone Ereignisse – Bound Asynchronous Event Handler

• Die Klasse BoundAsyncEventHandler erbt von der Klasse AsyncEventHandler

• Ein BoundAsyncEventHandler ist dauernd an einen eigenen Thread gebunden und hat ein besseres Zeitverhalten als ein AEH

A s y n cEv e n tH a n dle r

B o u n dA s y n cEv e n tH a n dle r

Page 23: Sönke Eilers

Asynchrone Ereignisse – Programmieren mit AEHs

• Verwendung der AEHs zu andern Zwecken als auf externe Ereignisse zu reagieren:– Jeglicher Code, der die fire Methode eines

Ereignisses aufrufen kann– Zeitliche Ereignisse ( Timer )– Fehler

Page 24: Sönke Eilers

Asynchrone Ereignisse – Timer

• Die Timer Objekte werden mit einem Handler verbunden

• Der OneShotTimer führt seinen Handler zu einem bestimmten Zeitpunkt aus

• Der PeriodicTimer führt seinen Handler periodisch aus

O bje ct

A s y n cEv e n t

Pe rio dicTim e rO n e S h o tTim e r

T im er{ a bs tra ct }

Page 25: Sönke Eilers

Asynchrone Ereignisse - OneShotTimer

OneShotTimer timer = new OneShotTimer(

new RelativeTime( 10000, 0 ),

// 10 Sekunden

handler);

timer.start();

10 Sekunden nach Start des Timers wird der für timer eingetragene Handler ausgeführt.

Page 26: Sönke Eilers

Asynchrone Ereignisse - PeriodicTimer

PeriodicTimer timer = new PeriodicTimer( null, // wird sofort gestartet new RelativeTime(2000, 0), // alle 2 Sek. handler);timer.start(); … timer.disable(); … timer.enable();

//…timer.stop();

Der PeriodicTimer löst nach dem Aufruf seiner start Methode alle 2 Sekunden seinen Handler aus.

Page 27: Sönke Eilers

Asynchrone Ereignisse – Fehlerbehandlung mit AEs

• Im Fehlerfall kann die fire Methode eines Asynchronen Ereignisses dazu genutzt werden, dass– die Fehlerbehandlung asynchron zu dem Code

stattfindet, der den Fehler ausgelöst hat– verschiedene Threads einen Handler für ein Ereignis

registrieren können

Page 28: Sönke Eilers

Asynchrone Ereignisse – weitere Nutzung

• Anstelle eines RealTime - Threads• Als ein allgemeiner Mechanismus für

Mitteilungen innerhalb eines Programms (um AWT events zu ersetzen )

Page 29: Sönke Eilers

Asynchroner Kontrolltransfer

• Man unterscheidet bei der Behandlung von asynchronen Meldungen zwischen– dem wiederaufnehmenden Modell ( Event Handling )– dem terminierenden Modell (ATC)

Page 30: Sönke Eilers

Asynchroner Kontrolltransfer – wiederaufnehmendes Modell (AEH)

• Das wiederaufnehmende Modell wird auch Ereignisbehandlung genannt

• Ein Prozess wird durch ein Ereignis unterbrochen, behandelt dieses und fährt an der Stelle weiter, an der es unterbrochen wurde

• Die Behandlung kann auch nebenläufig stattfinden

Page 31: Sönke Eilers

Asynchroner Kontrolltransfer - AEH

T h r ead T h r ead

Han d ler Han d ler

E r e ig n is

Beh an d lu n gab g es c h lo s s en

Page 32: Sönke Eilers

Asynchroner Kontrolltransfer – terminierendes Modell (ATC)

• Asynchroner Kontrolltransfer:• Jeder Prozess hat einen bestimmten Bereich,

innerhalb dessen er durch eine asynchrone Nachricht unterbrochen werden kann

• Dies kann den Thread beenden oder weitere Aktionen im Thread auslösen

Page 33: Sönke Eilers

Asynchroner Kontrolltransfer

• In früheren Implementierungen von Threads in Java gab es die Methoden resume, suspend und stop

• Diese sind inzwischen veraltet ( deprecated )• Es werden heute nur noch die Methoden interrupt und destroy als Mechanismen für ATC in Java genutzt

Page 34: Sönke Eilers

Asynchroner Kontrolltransfer

• Der asynchrone Kontrolltransfer ist in die Ausnahmebehandlung integriert worden

• ATC wird in RTSJ durch das werfen einer AIE Ausnahme erreicht

Th ro wa ble

Ex ce pt io n

O bje ct

Tim e d

I n te rru pte dEx ce pt io n

A s y n ch ro n o u s lyI n te rru pte dEx ce pt io n

< < I n te rfa ce > >S e ria liza ble

Page 35: Sönke Eilers

Asynchroner Kontrolltransfer

• Der Bereich, in dem der Thread unterbrochen werden darf, muss festgelegt werden:

void tuWas() throws AsynchronouslyInterruptedException {}

• Methoden die keine AIE werfen sind daher nicht von Interrupts betroffen

• Somit ist auch älterer, ererbter Code der nichts von RTSJ weiß sicher vor Überraschungen

Page 36: Sönke Eilers

Asynchroner Kontrolltransfer – ATC in RTSJ

• Es gibt drei Mechanismen in RTSJ, um eine AIE auszulösen:– Die interrupt Methode auf einen RealtimeThread aufrufen

– Die fire Methode auf einer AIE aufrufen– Ein Timed Objekt wirft eine AIE auf eine run

Methode

Page 37: Sönke Eilers

Asynchroner Kontrolltransfer

• Erzeugt man in einem Thread mit Hilfe von rt.interrupt() eine Ausnahme in dem RealtimeThread rt, so spricht man von einer generic AIE, die geworfen wird

• Dieser Mechanismus ist dazu gedacht, den jeweiligen Thread zu beenden, die AIE kann aber auch innerhalb einer catch Anweisung behandelt werden ( hierfür ist AIE.fire() besser geeignet)

• Die Ausnahme ist nicht mit der doInterruptable Methode verbunden

Page 38: Sönke Eilers

Asynchroner Kontrolltransfer

• Wenn man einen Thread mit rt.interrupt() unterbricht, ist die Reaktion abhängig von dem Zustand in dem sich der Thread befindet

• Ist der Thread in einer Methode oder an einer Stelle im Thread, die keine AIEs behandeln kann, wird abgewartet, bis das Programm eine Methode erreicht in der eine AIE geworfen werden kann

public void nichtUnterbrechbar { … }

… // nicht unterbrechbar im RT-Thread

public void unterbrechbar throws AIE {…}

Page 39: Sönke Eilers

Asynchroner Kontrolltransfer

• Innerhalb des try Blocks wird die Ausführung unterbrochen und es geht beim catch weiter

• Wird keine AIE gefangen, wird die AIE in der aufrufenden Methode geworfen

public void unterbrechbar() throws AIE{

try{

} catch (AIE aie){}

}

Page 40: Sönke Eilers

Asynchroner Kontrolltransfer

• Wird die AIE außerhalb des try Blocks geworfen, wird die Methode terminiert und die wird AIE in der aufrufenden Methode geworfen

public void unterbrechbar() throws AIE{

… // sollte die AIE hier geworfen werden

try{

} catch (AIE aie){}

}

Page 41: Sönke Eilers

Asynchroner Kontrolltransfer

• Falls der Thread durch ein wait, sleep oder join blockiert ist, wird der Thread neu geplant und die AIE wird geworfen

public void unterbrechbar() throws AIE{

Thread.sleep( 2000 );

}

Page 42: Sönke Eilers

Asynchroner Kontrolltransfer

• Falls der Thread in einer nicht zu unterbrechenden Methode blockiert ist, wird der Thread neu geplant und die AIE als abwartend markiert

public void nichtUnterbrechbar(){

Thread.sleep( 2000 );

}

Page 43: Sönke Eilers

Asynchroner Kontrolltransfer

• Die fire Methode wird auf einem AIE Objekt aufgerufen

• Zusammen mit der doInterruptable Methode des AIE Objekts kann man so einen Asynchronen Interrupt an eine bestimmte Methode eines RT-Threads schicken

• Die doInterruptible Methode eines AIE Objekts hat als Argument ein Objekt einer Klasse, die das Interruptible interface implementiert

Page 44: Sönke Eilers

Asynchroner Kontrolltransfer

A s y n ch ro n o u s ly I n te rru pte dEx ce pt io n

d o In t erru p t ib le( In t erru p t ib le lo gic)

< < in te rfa ce > >I n te rru pt ible

in t erru p t A ct io n ( A IE excep t io n )ru n ( A IE excep t io n )

P ar am eterf ü rd o I n ter r u p tib le

• In der run Methode steht der Code der ausgeführt werden soll

• In der interruptAction Methode der Code, der im Fall eines Interrupts ausgeführt werden soll

Page 45: Sönke Eilers

Asynchroner Kontrolltransfer

rt.this.aie = new AIE();

rt.this.aie.doInterruptible(

new Interruptible(){

public void interruptAction( AIE aie ){

// wird bei Interrupt ausgeführt

}

public void run( AIE aie) throws AIE{

// wird ansonsten ausgeführt

}

}); // Ende von doInterruptible

Page 46: Sönke Eilers

Asynchroner Kontrolltransfer

Tim e d

d o In t erru p t ib le( In t erru p t ib le lo gic)res et T im e( H igh R es o lu t io n T im e t im e)

• Ein Timed Objekt wirft zu einem gegebenen Zeitpunkt eine AIE in der run Methode seiner doInterruptible Methode

Timed timed = new Timed( new RelativeTime(1000,0));

Timed.doInterruptible( new Interruptible() {…});

Page 47: Sönke Eilers

Vorführung