Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Java, Java, Java R. Morelli

Ähnliche Präsentationen


Präsentation zum Thema: "Java, Java, Java R. Morelli"—  Präsentation transkript:

1 Java, Java, Java R. Morelli
Einführung in die Informatik II Ereignis-Basierte Programmierung Addendum Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität München Sommersemester 2004 22. Juni 2004 2 Copyright 2000 by Ralph Morelli. All rights reserved.

2 Überblick über diesen Teil
Interaktive Entwicklungsumgebungen Beispiel: Entwurf der Interaktion in Bumpers Threads und Synchronisation von Methoden (kurz) Das Beispiel stammt aus Gilbert's Buch "Object-oriented Design in Java", Kapitel 9: Implementing Class Relationships: Inheritance and Interfaces, pp

3 Entwicklungsumgebungen
Compiler helfen beim Übersetzen eines Quellprogramm in ein Zielprogramm Interaktive Entwicklungsumgebungen sind wesentlich mächtiger. Sie helfen beim Erstellen, Verwalten, Übersetzen und Testen, sowie bei der Versionskontrolle von Quell-und Zielprogrammen. Beispiele von Entwicklungsumgebungen: Eclipse, CodeGuide, CodeWarrior, JBuilder. Viel Hilfsmittel zur Navigation, Dokumentation, Testen Zugriff auf alle im Programm definierten Bezeichner Visualisierung der Vererbungshierarchie: Klassen-Betrachter Automatische JavaDoc Generierung Einzelschrittausführung des laufenden Programms Setzen von Haltepunkten („breakpoints“) Setzen von Beobachtungspunkten („watch points“)

4 Architektur eines (einfachen) Compilers
Quellprogramm Zielprogramm Übersetzer Symboltabelle Syntax Baum

5 Architektur von Entwicklungsumgebungen
ProjektManager Editor Übersetzer Layout-Editor ProjektDatenbank (Quellprogramme, Symboltabellen Syntax Bäume, Zielprogramme, Tests, Daten) Klassenbetrachter Debugger Versionskontroll- System

6 Verwaltung von Quellprogrammen
Zur Verwaltung aller Quellprogramme gibt es verschiedene Möglichkeiten. Makefile, Ant (Unix): Auflistung aller Quellprogramme und deren Compilationsabhängigkeiten Veränderung eines Quellprogramms induziert Übersetzung aller davon abhängigen Quellprogramme Projekt-Manager (Eclipse, Code-Guide, Code-Warrior): Visuelle Darstellung der Quellprogramme, Übersetzungsstatus, Formulierung von Untergruppen für bestimmte Tests und Versionen, Versionskontrolle.

7 Projekt-Manager (Code-Warrior)
Sicht aller Quell-Programme Sicht aller Versionen (targets) Programme für Version Bumper04

8 Zugriff auf Bezeichner

9 Zugriff auf Klassen-Definitionen

10 Klassen-Betrachter Der Klassen-Betrachter erlaubt eine Visualisierung der Klassenhierarchie, wobei Teil-Hierarchien unterdrückt oder gezeigt werden können (Notation nicht in UML):

11 Entwicklung der Maus-Interaktion in Bumpers
Sie kontrollieren ein bestimmtes Auto (drivenCar) mit der Maus. Die Anfangsrichtung der Autos ist zufällig gewählt. Das Ziel: Werfen Sie mit ihrem Auto soviele Autos wie möglich aus dem Rennen, bevor Ihr Auto aus dem Rennen geworfen wird.

12 Anwendungsfälle Erzeugung des Spielfeldes
Auffüllen mit n Autos, wobei zwischen langsamen, schnellen und benutzer-geführten Auto unterschieden werden muss Unterlegung von Musik für das Spielfeld Auswählen einer Anfangsposition für ein Auto Fahren von Autos mit gleichmäßiger Geschwindigkeit Überprüfung von Kollisionen zwischen Autos Audio-Untermalung für jede Kollision Überprüfung von Kollisionen von Autos mit dem Spielrand

13 Zusätzlicher Anwendungsfall
Erzeugung des Spielfeldes Auffüllen mit n Autos, wobei zwischen langsamen, schnellen und benutzer-geführten Auto unterschieden werden muss Unterlegung von Musik für das Spielfeld Auswählen einer Anfangsposition für ein Auto Fahren von Autos mit gleichmäßiger Geschwindigkeit Überprüfung von Kollisionen zwischen Autos Audio-Untermalung für jede Kollision Überprüfung von Kollisionen von Autos mit dem Spielrand Mausklicks zur Änderung der Richtung eines Autos Das Auto bewegt sich mit konstanter Geschwindigkeit in die Richtung des Klicks

14 Analyse und Entwurfsfragen
Wie stellen wir das Feld da? Wie modellieren wir das Auto? Wie animieren wir Autos, die gleichzeitig fahren? Was machen wir, wenn ein Auto den Rand trifft? Wie berechnen wir eine Kollision?

15 Fragen Wie stellen wir das Feld da? Wie modellieren wir das Auto?
Wie animieren wir Autos, die gleichzeitig fahren? Was machen wir, wenn ein Auto den Rand trifft? Wie berechnen wir eine Kollision? Wie lassen wir das Auto auf einen Mausklick reagieren? Wie berechnen wir die neue Route?

16 Analyse Car GameBoard Image Size Width, Height Image * Position Speed
startGame() stopGame() runCar() update() paint() getSize() getSpeed() getPosition()

17 Instanzdiagramm mit 5 Autos
Auto 5: Car Auto 1: Car Spiel: Gameboard Auto 2: Car Auto 4: Car Auto 3: Car

18 Parallelismus in Bumpers
Wenn Bumpers Interaktionen mit dem Benutzer unterstützen soll, dann muss es 2 parallele Aktivitäten geben: Benutzereingabe ueber die Maus Kontrollfluss des Spiels (Bewegen der Autos, Ueberpruefungen von Kollisionen) Java unterstuetzt parallele Aktivitaeten mit dem Thread-Konzept

19 Einschub: Java-Threads
Mehrfachbetrieb (Multitasking) ist die Technik der gleichzeitigen (nebenläufig, engl concurrent) Ausführung von mehreren Program-men auf einer Rechenanlage. Java unterstützt den Mehrfachbetrieb durch Threads. Eine Java-Thread (Kontrolfaden) ist eine Sequenz von exekutierbaren Anweisungen innerhalb eines Programm, die parallel zu anderen Sequenzen laufen kann. Die Implementierung der Java Virtual Machine selbst beruht auf Threads: Die Java-Speicherbereinigung (Garbage collection) ist z.B. ein Thread zum Sammeln von nicht länger referenzierten Objekten, der nebenläufig zum Java Programm abläuft. Auf einem sequentiellen Rechner müssen sich viele Threads einen einzigen Prozessor teilen. Scheduling => Thema der Vorlesung Betriebssysteme

20 Die Java-Klasse Thread
public class Thread extends Object implements Runnable { // Konstructoren public Thread(); public Thread(Runnable target); public Thread( String name ); // Klassen Methoden public static native void sleep(long ms) throws InterruptedException; public static native void yield(); // Instanz Methoden public final String getName(); public final int getPriority(); public void run(); // Methode der Java-Schnittstelle Runnable public final void setName(); public final void setPriority(); public synchronized native void start(); public final void stop(); }

21 Java-Schnittstelle Runnable
Java, Java, Java R. Morelli Java-Schnittstelle Runnable Thread implementiert die Methode run() der Schnittstelle Runnable. public abstract interface Runnable { public abstract void run() } Definition: Jeder Instanz einer Klassse, die die Schnittstelle Runnable, d.h. die Methode run() implementiert, ist ein lauffähiges Objekt. In Bumpers ist die Klasse Referee ein lauffaehiges Objekt! Jede mit start() gestartete Instanz eines Threads exekutiert als erstes die run() Methode. Unterklassen von Thread überschreiben im allgemeinen die run() Methode von Thread. Copyright 2000 by Ralph Morelli. All rights reserved.

22 Die Klasse Referee in Bumpers 6/22/2004
public class Referee implements Runnable { public static AudioClip MUSIC; private static int SLEEP_TIME = 200; private Thread theThread; private boolean isRunning; .... public void startGame() { if(isRunning){ return;} MUSIC.loop(); isRunning = true; theThread=new Thread(this); theThread.start(); } public void stopGame() { if(!isRunning){ return;} MUSIC.stop(); isRunning = false; ... } public void run() { while (isRunning) { try { Thread.sleep(SLEEP_TIME); catch (InterruptedException e) { e.printStackTrace(); moveCars(); ....

23 Ausführung von Threads:Überschreibung von run
Beispiel: Ein Thread, das eine gegebene Nummer 10-mal ausdruckt. Wir definieren NumberThread als Unterklasse von Thread und überschreiben die run() Methode: public class NumberThread extends Thread { int num; public NumberThread(int n) { num = n; } public void run() { for (int k=0; k < 10; k++) { System.out.print(num); } //for } // run() } // NumberThread

24 Exekution mehrfacher Threads
Hier erzeugen wir 5 Instanzen vom Typ NumberThread und starten dann jede Instanz mit start(): public class Numbers { public static void main(String args[]) { NumberThread number1, number2, number3, number4, number5; number1 = new NumberThread(1); number1.start(); number2 = new NumberThread(2); number2.start(); number3 = new NumberThread(3); number3.start(); number4 = new NumberThread(4); number4.start(); number5 = new NumberThread(5); number5.start(); } // main() } // Numbers Die threads laufen in der Reihenfolge, in der sie gestartet worden sind. Bei kleinem Werten für num ist die Ausgabe noch sequentiell.

25 Exekution mehrfacher Threads
Wenn wir den Wert von num erhöhen, überlappt sich die Ausgabe der Threads:

26 Alternative Art ein Thread zu implementieren: Runnable
Java, Java, Java R. Morelli Alternative Art ein Thread zu implementieren: Runnable Threads kann man auch kreiieren, indem man dem Thread- Konstruktor ein lauffähiges Objekt als Argument übergibt. public class NumberPrinter implements Runnable { int num; public NumberPrinter(int n) { num = n; } public void run() { for (int k=0; k < 10; k++) System.out.print(num); } // run() } // NumberPrinter NumberPrinter ist ein lauffähiges Objekt, denn es hat run() implementiert. Thread number1; number1 = new Thread(new NumberPrinter(1)); number1.start(); Copyright 2000 by Ralph Morelli. All rights reserved.

27 Zustände eines Threads
Zustand Beschreibung Ready Bereit zur Exekution, wartet aber aufs Rechenwerk. Running Ist am Laufen. Waiting Wartet auf ein Ereignis. Sleeping Schläft für eine gegebene Zeit. Blocked Wartet auf Ein/Ausgabe. Dead Ist Terminiert. -> UML Zustandsdiagram Vorlesungsblock über Automaten

28 Die sleep() Methode Wenn ein Thread seine sleep() Methode aufruft, dann gibt es freiwillig für eine bestimmte Zeit den Prozessor auf. Nachdem diese Zeit vorüber ist, wird eine Ausnahme vom Typ InterruptedException erzeugt. (Wir müssen sleep() also in einem try-Block aufrufen). Wir fangen diese Ausnahme in einem catch-Block ab und bringen das Thread damit wieder in den Zustand ready. Sobald der Prozessor nichts mehr zu tun hat, nimmt er die Ausführung dieses Threads wieder auf (genauer: der Thread, der am längsten im Zustand ready gewartet hat). Beispiel: try { Thread.sleep(SLEEPTIME); } Beispiel: Thread.sleep(SLEEPTIME); catch (InterruptedException e) {....}

29 Detaillierter Entwurf unseres Spiels
Wir entwerfen also Referee als lauffähiges Objekt Runnable GameBoard +getDrivenCar() +getRobotCars() +paint() Referee + void start() +void stop() + void run() +moveCars() +checkForCollisions()

30 Synchronisierte Methoden
Wenn wir sicherstellen müssen, dass nur ein Thread zur Zeit in einer Methode sein kann, dann verwenden synchronisierte Methode. Jede synchronisierte Methode ist mit einem Schloss (lock) versehen. Wenn eine synchronisierte Methode aufgerufen wird, schliesst sie das Schloss für andere Aufrufer. Während eine Methode geschlossen ist, können keine anderen Threads diese Methode exekutieren. Sie müssen "draussen" warten, bis die Methode ihr Schloss wieder aufgemacht hat. Nach der Exekution des Methodenrumpfes wird das Schloss wieder aufgemacht. Die Klasse DrivenCar enthält synchronisierte Methoden.

31 Synchronisierte vs nicht-synchronisierte Methoden
class DrivenCar { public synchronized void notifyInstruments() { // Rumpf von notifyInstruments }; public List getInstruments() { //Rumpf von getInstruments } S1

32 Synchronisierte vs nicht-synchronisierte Methoden
class DrivenCar { public synchronized void notifyInstruments() { // Rumpf von notifyInstruments }; public List getInstruments() { //Rumpf von getInstruments }

33 Synchronisierte vs nicht-synchronisierte Methoden
class DrivenCar { public synchronized void notifyInstruments() { // Rumpf von notifyInstruments }; public List getInstruments() { //Rumpf von getInstruments } S1 S1 S1 S1 S1 S1 S1 S1

34 Animierung der Autos: Vorüberlegungen
Nachdem des Spielfeld erschaffen worden ist und die Autos ins Spielfeld geladen worden sind, müssen wir sie zum Fahren bringen. Wir machen dies in der run() Methode der Java Schnittstelle runnable()im Spielfeld Solange das Spiel noch läuft (angezeigt durch den Wert der booleschen Varialben isRunning), durchlaufen wir eine Endlosschleife. Innerhalb dieser Endlosschleife rufen wir die moveCars() Methode, die die aktuelle Positionen der Autos berechnet Um das nicht zu schnell zu wiederholen, bauen wir innerhalb der Endlosschleife eine kleine Verzögerung ein. Solange die Schleife ca 20 mal pro Sekunde ausgeführt wird, ist die Animation relativ flüssig. Wir definieren deshalbe eine Konstante SLEEP_TIME = 30 und rufen die sleep() Methode vom Thread mit diesem Wert auf.

35 Implementierung der Run() Methode
public void stopGame() { if(!isRunning){ return;} MUSIC.stop(); isRunning = false; ... } public void run() { while (isRunning) { try { Thread.sleep(SLEEP_TIME); catch (InterruptedException e) { e.printStackTrace(); moveCars(); ....

36 Benutzer-kontrolliertes Auto
Das Ziel des Spiels ist, dass wir durch geschickte Mausbewegugen unser Auto so mit anderen Autos kollidieren lassen, dass wir das Spiel gewinnen und nicht von anderen Autos überfahren werden.. Wir definieren jetzt eine neue Klasse Benutzer-kontrolliertes Auto, dessen Richtung wir mit der Maus kontrollieren können. Wenn der Benutzer die Maus klickt, dann bewegt sich das benutzer-kontrollierte Auto in die Richtung des Mausklicks. Für Mausereignisse gibt es in Java das Ereignis MouseEvent und den Ereignisempfänger MouseListener Für die neue Klasse Benutzer-kontrolliertes Auto (DrivenCar) definieren wir einen Ereignisempfänger MouseHandler, der eine Unterklasse von MouseAdapter ist, einer trivialen Implementation von MouseListener. (d.h. eine Implementation mit leeren Rümpfen für alle öffentlichen Methoden von MouseListener).

37 MouseAdapter public abstract class MouseAdapter extends Object implements Mouselistener{ public void mouseClicked(MouseEvent e); public void mouseEntered (MouseEvent e); public void mouseExited(MouseEvent e); public void mousePressed (MouseEvent e); public void mouseReleased (MouseEvent e); }

38 Runnable MouseListener MouseAdapter Mouse Referee ... + void start()
+void stop() + void run() +update(Graphics g) paint() Gameboard mouseClicked() paint()

39 Implementierung von MouseHandler
class Mouse extends MouseAdapter { private DrivenCar theDrivenCar; private Gameboard theField; public Mouse(Gameboard playingField, DrivenCar dc) { this.theDrivenCar = dc; this.theField = playingField; this.theField.addMouseListener(this); } public void mousePressed(MouseEvent e) { // Holen der Maus-Koordinaten mit (e.getX(), e.getY()) // Berechnung der neuen Richtung für DrivenCar theDrivenCar.setDirection(degree);

40 Zusammenfassung Gezeigt: Entwicklung eines Systems mit einer interaktiven Entwicklungsumgebung Interaktive Entwicklungsumgebungen vs Compiler Vorteil: Integration vieler Werkzeuge Nachteil: Erhöhter Lernaufwand Mehrfachbetrieb: Gleichzeitige Ausführung von mehreren Program-men auf einer Rechenanlage. Java unterstützt Mehrfachbetrieb durch Threads, eine Sequenz von exekutierbaren Anweisungen innerhalb eines Programm, die parallel zu anderen Sequenzen laufen kann. Kooperation von Threads untereinander erfolgt mit sleep() Synchronisieren von Thread-Methoden garantiert exklusiven Zugriff auf eine Methode (Monitor-Konzept).


Herunterladen ppt "Java, Java, Java R. Morelli"

Ähnliche Präsentationen


Google-Anzeigen