Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 1 Programmierkurs Java Vorlesung im WS 1998/1999 am FB Informatik der Universität.

Ähnliche Präsentationen


Präsentation zum Thema: "Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 1 Programmierkurs Java Vorlesung im WS 1998/1999 am FB Informatik der Universität."—  Präsentation transkript:

1 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 1 Programmierkurs Java Vorlesung im WS 1998/1999 am FB Informatik der Universität Oldenburg Vorlesung 15 Dietrich Boles

2 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 2 Gliederung von Vorlesung 15 Ein-/Ausgabe Threads GUI-Programmierung Applets Client-Server-Programmierung RMI Java-Beans

3 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 3 Ein-/Ausgabe in Java JDK: package java.io; basiert auf dem Konzept der Datenströme DatenquelleFilterDatensenke Eingabe- Datenstrom Ausgabe- Datenstrom Folge von Daten Terminal Datei Zeichenkette Socket...

4 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 4 Ein-/Ausgabe in Java Unmenge an unterschiedlichen Klassen Wichtige Klassen: –InputStream (abstrakt) –OutputStream (abstrakt) –DataInputStream –BufferedReader –InputStreamReader –DataOutputStream –PrintStream Wichtige Variablen: –System.err (PrintStream) –System.in (InputStream) –System.out (PrintStream)

5 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 5 Ein-/Ausgabe in Java / Beispiel 1 Eingabe von Tastatur / Ausgabe auf Bildschirm: import java.io.*; public class TerminalIOTest { public static void main(String[] args) { BufferedReader in = null; try { in = new BufferedReader( new InputStreamReader(System.in)); String eingabe = new String(); do { System.out.print("Zahl eingeben: \n"); eingabe = in.readLine(); int zahl = Integer.parseInt(eingabe); System.out.println("danke: " + zahl); } while ((eingabe != null) && (eingabe.length() > 0)); }

6 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 6 Ein-/Ausgabe in Java / Beispiel 1 catch (IOException exc) { System.err.println("Ein-/Ausgabefehler: " + exc); } catch (NumberFormatException exc) { System.err.println("Ein-/Ausgabefehler: " + exc); } finally { try { if (in != null) in.close(); } catch (IOException exc) {} }

7 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 7 Ein-/Ausgabe in Java / Beispiel 2 Eingabe aus Datei: import java.io.*; public class FileIOTest { public static void main(String[] args) { BufferedReader in = null; try { in = new BufferedReader( new FileReader("eingabe.dat")); String eingabe = null; while ((eingabe = in.readLine()) != null) { System.out.println(eingabe); } catch (...) // wie in Beispiel 1...

8 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 8 Thread Ein Java-Programm mit mehreren Kontrollflüssen (Threads) aber einem Adreßraum zu jeder Zeit ist genau ein Kontrollfluß aktiv das Java-Laufzeitsystem steuert, welcher Thread aktiv ist und wann ein Threadwechsel eingeleitet wird es gibt jedoch auch Steuerungsmethoden für den Programmierer Klasse: java.lang.Thread Probleme: –Synchronisation mehrerer Threads –Kommunikation mehrerer Thread untereinander –Prozessorzuteilung –Verklemmungen (Deadlocks) –...

9 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 9 Threads / Beispiel 1 2 Threads: public class PingPong extends Thread { String word; int delay; public PingPong(String text, int delay) { this.word = text; this.delay = delay; } public void run() { try { while (true) { System.out.print(this.word + " "); sleep(delay); // warten } } catch (InterruptedException exc) { System.err.println("Interruption: " + exc); return; } }

10 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 10 Threads / Beispiel 1 public static void main(String[] args) { new PingPong("ping", 33).start(); // 1/30 Sek. new PingPong("PONG", 100).start(); // 1/10 Sek. } Ausgabe (nicht deterministisch): ping PONG ping ping PONG ping ping ping PONG ping...

11 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 11 Threads / Beispiel 2 Synchronisation: import java.util.*; class Konto { private double kontostand; public Konto(double init) { this.kontostand = init; } public synchronized double getKontostand() { return this.kontostand; } public synchronized void einzahlen(double betrag) { this.kontostand = this.kontostand + betrag; // ! Problem: hier Threadwechsel }

12 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 12 Threads / Beispiel 2 public class Sparer extends Thread { Konto konto; public Sparer(Konto konto) { this.konto = konto; } public void run() { try { while (true) { this.konto.einzahlen(new Random().nextDouble()*1000); System.out.println(this.konto.getKontostand()); sleep((long)this.konto.getKontostand()); // warten } } catch (InterruptedException exc) { System.err.println("Interruption: " + exc); return; }

13 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 13 Threads / Beispiel 2 public static void main(String[] args) { Konto konto = new Konto(1000); // beide Sparer haben ein gemeinsames Konto new Sparer(konto).start(); } /* A B K ----------------- 1000 +500 1500 (?) */ }

14 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 14 Threads / Beispiel 3 Thread-Kommunikation: import java.util.*; class Stack { Object[] table; int actual = -1; public Stack(int size) { this.table = new Object[size]; } public synchronized void push(Object elem) { if (actual < (this.table.length-1)) { this.table[++this.actual] = elem; notifyAll(); // wartende Threads informieren } } public synchronized Object pop() { try { while (actual < 0) { wait(); // Warten auf ein Element } return this.table[this.actual--]; } catch (InterruptedException exc) { return null; } }

15 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 15 Threads / Beispiel 3 class Chef extends Thread { Stack akten_haufen; public Chef(Stack haufen) { this.akten_haufen = haufen; } public void run() { try { int nummer = 1; while (true) { String akte = ("Akte " + nummer++); this.akten_haufen.push(akte); System.out.println("Chef: " + akte); sleep((long)(new Random().nextDouble()*1000)); // neue Akte erzeugen } } catch (InterruptedException exc) { System.err.println("Chef interrupted: " + exc); return; } } }

16 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 16 Threads / Beispiel 3 class Knecht extends Thread { Stack akten_haufen; int fleiss; public Knecht(Stack haufen, int fleiss) { this.akten_haufen = haufen; this.fleiss = fleiss; } public void run() { try { while (true) { String akte = (String)this.akten_haufen.pop(); System.out.println("Knecht " + fleiss + ": " + akte); sleep((long)(fleiss*new Random().nextDouble()*100)); // Akten bearbeiten } } catch (InterruptedException exc) { System.err.println("Chef interrupted: " + exc); return; } } }

17 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 17 Threads / Beispiel 3 public class Betrieb { public static void main(String[] args) { Stack akten_haufen = new Stack(10); // ein Chef und zwei Knechte teilen sich den Aktenhaufen new Chef(akten_haufen).start(); new Knecht(akten_haufen, 1).start(); // fleissig new Knecht(akten_haufen, 9).start(); // faul } Ausgabe (nicht deterministisch): Chef: Akte 1 Knecht 1: Akte 1 Chef: Akte 2 Knecht 1: Akte 2 Chef: Akte 3 Knecht 2: Akte 3...

18 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 18 GUI-Programmierung Graphische Benutzeroberflächen (GUI) JDK: package java.awt; + Unterpackages (Abstract Window Toolkit) JDK 1.0, JDK 1.1: unterschiedliche Klassen und Eventbehandlung JDK 1.2: SWING (komfortable GUI-Klassen) umfaßt mehrere Kategorien: –graphische Elemente: Bilder, Polygone, Farben, Fonts,... –UI-Komponenten (Component): Buttons, Menüs, Texteingabefelder,... –Behälter-Klassen (Container): Windows, Canvases, Dialogboxen,... –Layout-Manager: Kontrolle der räumlichen Anordnung –Event-Behandlung: Mouse-Events, Keyboard-Events, Aktionsevents,... Andere Art der Programmierung: invertierte Programmierung

19 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 19 GUI-Programmierung / Beispiel 1 Einfachstes Programm: import java.awt.*; public class WindowTest extends Frame { public static void main(String[] args) { WindowTest win = new WindowTest("Test"); win.setSize(300, 100); win.show(); // ab hier arbeitet der EventManger des AWT } public WindowTest(String title) { super(title); add(new Label("Start")); } Test Start

20 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 20 GUI-Programmierung / Beispiel 2 Event-Behandlung: import java.awt.*; import java.awt.event.*; class ButtonListener implements ActionListener { Button button; public ButtonListener(Button button) { this.button = button; } public void actionPerformed(ActionEvent event) { if (this.button.getLabel().equals("Start")) this.button.setLabel("Stop"); else this.button.setLabel("Start"); } Event-Test Start

21 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 21 GUI-Programmierung / Beispiel 2 public class EventTest extends Frame { public static void main(String[] args) { EventTest win = new EventTest(Event-Test"); win.setSize(300, 100); win.show(); // ab hier arbeitet der EventManger des AWT } Button button; public EventTest(String title) { super(title); this.button = new Button("Start"); add(this.button, "Center"); // Layout-Manager button.addActionListener(new ButtonListener(button)); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent event) { dispose(); System.exit(0); } } ); }

22 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 22 Applets Applets: Java-Programme, die in einem WWW-Browser ausgeführt werden können JDK: package java.applet; basiert sehr stark auf dem AWT Tool: appletviewer Datei: Uhr.html Aufruf: appletviewer name.html oder in WWW-Browser laden Name Aktuelle Uhrzeit.class width=100 height=100>

23 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 23 Applets / Beispiel 1 import java.awt.*; import java.applet.*; public class TestApplet extends Applet { private Label label; // wird beim ersten Start aufgerufen (load/reload) public void init() { System.out.println("init()"); } // wird nach init aufgerufen sowie beim erneuten // Besuch einer WWW-Seite public void start() { System.out.println("start()"); this.label = new Label(Test-Label"); this.add(this.label); } // wird beim Stoppen aufgerufen sowie beim Verlassen // einer WWW-Seite public void stop() { System.out.println("stop()"); this.remove(this.label); } // wird nur beim "Zerstoeren" nach stop aufgerufen public void destroy() { System.out.println("destroy()"); } } Netscape: Title Test-Label

24 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 24 Applets / Beispiel 2 import java.awt.*; import java.applet.*; import java.util.*; public class Uhr extends Applet implements Runnable { protected Thread uhr = null; public void start() { if (uhr == null) { uhr = new Thread(this); uhr.start(); } } public void stop() { uhr.stop(); uhr = null; } public void run() { while (uhr != null) { repaint(); try { uhr.sleep(1000); } catch(Exception e){} }

25 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 25 Applets / Beispiel 2 public void paint(Graphics g) { // Applet-"main" Date jetzt = new Date(); String str = jetzt.getHours() + ":" + jetzt.getMinutes() + ":" + jetzt.getSeconds(); g.drawString(str, 25, 20); } Uhr Aktuelle Uhrzeit.class width=200 height=100> Netscape: Uhr 16:47:39 Aktuelle Uhrzeit

26 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 26 Windows + Applets import java.awt.*; import java.applet.*; public class TestWindowApplet extends Applet { private Label label; public static void main(String[] args) { TestWindow win = new TestWindow("Test-Window"); win.setSize(300, 100); win.show(); } public void start() { this.label = new Label(Test-Label"); this.add(this.label); } public void stop() { this.remove(this.label); } }

27 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 27 Windows + Applets class TestWindow extends Frame { public TestWindow(String title) { super(title); TestWindowApplet applet = new TestWindowApplet(); applet.start(); add(applet, "Center"); } java TestWindowApplet über HTML-Seite in Netscape laden Test-Window Test-Label Netscape: Title Test-Label

28 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 28 Client-Server Programmierung Client-Server-Programme: Programme, die auf unterschiedlichen Rechner laufen (können) und miteinander kommunizieren JDK: package java.net; charakteristisch: –mehrere Prozesse –kein gemeinsamer Adreßraum –Datenaustausch via Kommunikation (über Sockets) Server: Programm, das bestimmte Dienste mehreren ihm im allgemeinen unbekannten Clients anbietet (bspw. Drucker) Client: Programm, das Server-Dienste nutzen will

29 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 29 Client-Server Programmierung / Beispiel import java.io.*; import java.net.*; public class Server { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(5555); Socket s; while ((s = ss.accept()) != null) { BufferedReader in = new BufferedReader( new InputStreamReader(s.getInputStream())); String eingabe = null; while ((eingabe = in.readLine()) != null) { System.out.println(eingabe); } } } catch (Exception e) { System.err.println("Fehler: "+e); } } } // liest Daten von Clients und gibt sie aus

30 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 30 Client-Server Programmierung / Beispiel import java.io.*; import java.net.*; public class Client { public static void main(String[] args) { try { Socket s = new Socket(jeddeloh", 5555); PrintWriter sout = new PrintWriter(s.getOutputStream()); for (int i=0; i<args.length; i++) { sout.println(args[i]); sout.flush(); } } catch (Exception e) {System.err.println("Fehler: "+e);} } } // schickt Argumente zum Server

31 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 31 Remote Method Invocation (RMI) Motivation: Alternative zur Realisierung von Client-Server-Programmen Idee: –Aufruf von Methoden von Objekten, die auf anderen Rechnern laufen –Datenaustausch via Parameter und Rückgabewerten –ähnlicher Ansatz: CORBA (sprachunabhängig) zusätzliche Werkzeuge erforderlich: JDK-package, Compiler, Broker Rechner A Rechner B Client Server Turn t = spieler.nextTurn(); nextTurn(); spieler

32 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 32 Java Beans Technologie für Software-Komponenten Ziel: Programme (Komponenten) schreiben, die überall laufen und überall wiederverwendet werden können in Java: Komponenten (Beans) = spezielle Objekte Konkurrenz: ActiveX von Microsoft Motivation: Anwendungsprogrammierer holt sich benötigte (binäre!) Beans und verknüpft sie (u.U. mit graphischen Hilfsmitteln) zu einem Gesamtprogramm (Container) Beispiele für Beans: –Buttons– Rechtschreibprüfung –Scrollbars – Textverarbeitung –Zeitgeber –...

33 Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 33 Java Beans Bean Development Kit (BDK): –package java.beans; –Bean-Beispiele –einfacher graphisch-interaktiver Test-Container (BeanBox) –komplette Sourcen –Dokumentation besondere Merkmale / Eigenschaften / Dienste: –Verwaltung von Eigenschaften (Properties = besondere Attribute) –Introspektion (Zugriff auf Struktur von Komponenten) –Ereignisbehandlung –Persistenz (dauerhaftes Abspeichern von Objektzuständen) –Unterstützung für die Anwendungsentwicklung (Entwicklungswerkzeuge)


Herunterladen ppt "Programmierkurs Java WS 98/99 Vorlesung 15 Dietrich Boles 17/02/99Seite 1 Programmierkurs Java Vorlesung im WS 1998/1999 am FB Informatik der Universität."

Ähnliche Präsentationen


Google-Anzeigen