Java, Java, Java R. Morelli

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
der Universität Oldenburg
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Einführung in die Programmierung Zusammenfassung
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Kapselung , toString , equals , Java API
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Threads Richard Göbel.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Ein Beispiel in Java.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
DVG Einführung in Java1 Einführung in JAVA.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Klassen 02 - Klassen.
Das Roboterprojekt Einführung Der erste Entwurf Das Thread-Konzept Hindernisse Website.
Java Threads Sebastian Werler
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität.
University of Applied Sciences Übung Objektorientierte Programmierung II Dipl.-Inf. (FH) Markus Vogler.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Grundlagen der Programmierung
Grundlagen der Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Parallelisierung für Multiprozessor-Maschinen Teil 2.
Parallelisierung für Multiprozessor-Maschinen
Programmiervorkurs WS 2014/15 Schleifen
Threads in Java Wiederholung der BS Grundlagen Alois Schütte AOSD1.
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Java-Kurs Übung Benutzeroberflächen und Graphik
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Robuste Programme durch Ausnahmebehandlung
Prof. Dr. Alois Schütte Advanced System Programming 1 Das concurrent Paket 1 Überblick 2 Lock 3 Condition 4 Queue 5 Executors.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Übung Informatik I exercise01. 2 Inhaltsübersicht Nachbesprechung Übung 1 Individuelle Fragen/Bemerkungen.
A Workshop About this chapter General description Units Time Schedule
Threads in Java Threads  Sprachumfang von Java Der Java-Standard fordert nur die Unterstützung von Thread-Prioritäten. Es gibt keine Forderung bzgl.:
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
1 VE 11 Kruskal-Realisierung Listen. 2 Auf dem Weg zur Kruskal-Realisierung Vorüberlegungen: Der Graph könnte dargestellt werden als Menge von Knoten,
Java Programme nur ein bisschen objektorientiert.
Implementieren von Klassen
 Präsentation transkript:

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.

Ü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. 279-289.

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“)

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

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

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.

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

Zugriff auf Bezeichner

Zugriff auf Klassen-Definitionen

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

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.

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

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

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?

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?

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

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

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

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

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(); }

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.

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(); ....

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

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. 11111111112222222222333333333344444444445555555555

Exekution mehrfacher Threads Wenn wir den Wert von num erhöhen, überlappt sich die Ausgabe der Threads: 111111111111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111112222222 222222222222222222222222222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222223333333333333333333333333 333333333333333333333333333333333333333333333333333333333333333333333 333333333333333333333333333444444444444444444444444444444444444444444 444444444444444444444444444444444444444444444444444444444444444444444 444444444455555555555555555555555555555555555555555555555555555555555 555555555555555555555555555555555555555555555555555555555555552222222 222233333333333333333333333333333333333333333333333333333333333333333 333333333333334444444444444444444444444444445555555555555555555555555 555555555555555555555555555555555555555555555555555555444444444444444 4444444444444444444444444444444444

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.

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

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) {....}

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()

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.

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

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

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

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.

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(); ....

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).

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); }

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

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);

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).