programmierkurs java vorlesung 15 dietrich boles seite 1 programmierkurs java vorlesung am fb...
TRANSCRIPT
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 1
Programmierkurs Java
Vorlesung
am FB Informatik
der Universität Oldenburg
Vorlesung 15
Dietrich Boles
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 2
Gliederung von Vorlesung 15
• Ein-/Ausgabe
• Threads
• GUI-Programmierung
• Applets
• Client-Server-Programmierung
• RMI
• Java-Beans
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 3
Ein-/Ausgabe in Java
• JDK: package java.io;• basiert auf dem Konzept der Datenströme
Datenquelle Filter Datensenke
Eingabe-Datenstrom
Ausgabe-Datenstrom
Folge von Daten
TerminalDateiZeichenketteSocket...
...
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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)
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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)); }
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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) {}
}
}
}
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
...
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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)
– ...
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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;
} }
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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 ...
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
}
}
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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;
}
}
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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();
new Sparer(konto).start();
}
/* A B K
-----------------
1000
+500
+500
1500 (?)
*/
}
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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; }} }
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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;
} } }
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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;
} } }
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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 1Knecht 1: Akte 1Chef: Akte 2Knecht 1: Akte 2Chef: Akte 3Knecht 2: Akte 3...
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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 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
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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); } } );} }
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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 <HTML> <HEAD> <TITLE> Name </TITLE> </HEAD>
<BODY>
<H3> Aktuelle Uhrzeit </H3>
<APPLET code=“<name>.class“ width=100 height=100>
</APPLET>
</BODY>
</HTML>
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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){}
}
}
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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);
} }
<HTML> <HEAD> <TITLE> Uhr </TITLE> </HEAD>
<BODY>
<H3> Aktuelle Uhrzeit </H3>
<APPLET code=“Uhrzeit.class“ width=200 height=100>
</APPLET>
</BODY>
</HTML>
Netscape: Uhr
16:47:39
Aktuelle Uhrzeit
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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); }
}
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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 ladenTest-Window
Test-Label
Netscape: Title
Test-Label
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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
ClientServer
Turn t = spieler.nextTurn(); nextTurn();
spieler
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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 – ...
Programmierkurs Java Vorlesung 15 Dietrich Boles Seite 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)