Thread

Werbung
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung & Threads
Praktikum aus Softwareentwicklung 2
Java Praktikum – SS 2008 – [email protected]
1
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
& Threads
• Netzwerkprogrammierung
– URL, URLConnection, UDP, TCP
• Threads
– Parallele Programme, Synchronisation, …
Java Praktikum – SS 2008 – [email protected]
2
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
Grundlagen (1/2)
• Kommunikation zwischen verteilten Programmen
Host Computer
Host Computer
Java Virtuelle
Maschine
JavaVirtuelle
Virtuelle
Java
JVM, Web Server,
Maschine
Maschine
Datenbank,
Ftp..
Netzwerk-Betriebssystem
Netzwerk-Betriebssystem
Netzwerk
Java Praktikum – SS 2008 – [email protected]
3
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
Grundlagen (2/2)
• ISO OSI, IP und Java - http://www.ethereal.com/
OSI 7 Schichten
Application
Presentation
Session
Transport
Network
Data Link
Physical
Internet
java.net
URL etc.
http, ftp, telnet, ...
Streams
TCP, UDP
Internet Protocol
Ethernet, Token
Ring, FDDI, ..
Socket…
InetAddress
Java Praktikum – SS 2008 – [email protected]
4
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
HTTP und URLs
• Hypertext Transfer Protocol (HTTP/1.1)
• Uniform Resource Locator
protocol :// [user@] host [:port] /filepath [ref]
– RFC2396… http://www.rfc-editor.org/
http://www.w3.org/Addressing/URL/url-spec.html
• Beispiele:
–
–
–
–
–
http://www.somewhere.com:80/remoteSurvey.html
https://secure.tiscover.com:443
ftp://www.nowhere.net/
file://D:/tmp/bsp.html
mailto://[email protected]
Java Praktikum – SS 2008 – [email protected]
5
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
Verwendung von URLs
• Ein Objekt der Klasse java.net.URL repräsentiert
eine Ressource im Internet
try {
URL u = new URL("http://java.sun.com/index.html");
} catch(MalformedURLException e) { … }
// URL(String protocol, String host, int port, String file)
• Parsen:
u.getProtocol();
u.getHost(); // ... (File, Port, Ref)
• Direktes Lesen von einer URL:
InputStream in = u.openStream();
Java Praktikum – SS 2008 – [email protected]
6
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
URLConnection
• Verbindung wird durch ein URLConnection Objekt
repräsentiert und bei dessen Instanziierung
aufgebaut. Generell ist das Erzeugen einer Connection
zu einem Url ein mehrstufiger Prozess.
URLConnection uc = u.openConnection();
u.connect();
• Datenaustausch erfolgt über Streams der
URLConnection
InputStream ui = uc.getInputStream();
OutputStream uo = uc.getOutputStream();
• HttpURLConnection
HttpURLConnection http_uc = (HttpURLConnection)uc;
uc.getRequestMethod();
uc.getResponseMessage();
Java Praktikum – SS 2008 – [email protected]
7
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
Beispiel: "mailto:"
import java.io.*;
import java.net.*;
...
System.setProperty("mail.host", „smtp.tiscover.com");
URL u = new URL("mailto:[email protected]");
URLConnection conn = u.openConnection();
PrintWriter out = new PrintWriter(
new OutputStreamWriter(conn.getOutputStream()));
out.println("Subject: Test");
out.println();
out.println("Hello World!");
out.close();
...
Java Praktikum – SS 2008 – [email protected]
8
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
TCP/IP, UDP
• Internet Protocol (IP)
– Routing der IP-Pakete (versehen mit Empfänger, Sender)
• Transport Control Protocol (TCP)
– Verbindung über gemeinsamen Kommunikationskanal
– Stückelt Nachricht in mehrere durchnummerierte Pakete
– Überprüft ob Paket Ziel erreicht hat, ansonsten Wiederholung
– Empfänger setzt Pakete in richtiger Reihenfolge wieder
zusammen
• Uniform Datagram Protocol (UDP)
– Keine ständige Verbindung - zustandslos
– Jedes Paket wird einzeln gesendet
– Paket kann verloren gehen, keine Kontrolle
– Multicast ist möglich
Java Praktikum – SS 2008 – [email protected]
9
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
Sockets
• Sockets sind die Schnittstelle zwischen Anwendung
und Netzwerkverbindung
• Host:Port zur Identifizierung der Anwendungen
Host 1
169.254.235.246
Client
9951
UDP: Pakete
TCP: Stream
Host 2
169.254.235.247
80
HttpServer
• Die "Server"-Anwendung wartet auf einem
vereinbarten Port auf Verbindungsaufnahmen durch
Client-Anwendungen
Java Praktikum – SS 2008 – [email protected]
10
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
UDP – paketorientiert
• Datenaustausch basiert auf Paketen (Datagramme)
• DatagramPacket repräsentiert Datenpaket
– Paket zum Senden:
DatagramPacket(byte[] buf, int length,
<Host>, <Port>)
– Paket zum Empfangen:
DatagramPacket(byte[] b, int len)
• DatagramSocket zum Senden und Empfangen
public void send(DatagramPacket d);
public void receive(DatagramPacket d);
Java Praktikum – SS 2008 – [email protected]
11
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
UDP – Senden/Empfangen
• Initialisierung
DatagramSocket socket = new DatagramSocket(9998);
• Request schicken
InetAddress address =
InetAddress.getByName("host");
DatagramPacket packet =
new DatagramPacket(buf, buf.length, address, 8889);
socket.send(packet);
• Response empfangen
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData());
Java Praktikum – SS 2008 – [email protected]
12
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
TCP – verbindungsorientiert
•
•
•
•
Kommunikation erfolgt bidirektional über Sockets
Socket := (Host, Portnummer)
Implementierung des Datenaustausches mit Streams
Client stellt Verbindung her durch Instanziierung
eines Socket Objektes
• Server ist implementiert durch ServerSocket und
wartet auf einer bestimmten Portnummer auf
Anfragen:
public Socket accept();
• Verbindungsabbruch durch Schließen des Sockets
Java Praktikum – SS 2008 – [email protected]
13
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
Verbindungsaufbau
• Client
Socket s = new Socket(<Host>,<Port>);
InputStream si = s.getInputStream();
OutputStream so = s.getOutputStream();
• Server (gestartet auf <Host>)
ServerSocket ss = new ServerSocket(<Port>);
Socket s = ss.accept(); // blockierend
InputStream from_so = s.getInputStream();
OutputStream to_si = s.getOutputStream();
• Das Socket Objekt repräsentiert die Verbindung
Java Praktikum – SS 2008 – [email protected]
14
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
Datenaustausch
• Lesen vom InputStream, schreiben auf den OutputStream
• Protokoll muss vereinbart werden
– Kodierung der Daten
– Koordination der Aktivitäten (Kontrollfluss)
• Beispiel: Simple Mail Transfer Protocol (RFC-821)
– Zeilenweiser Austausch von Kommandos und Statusantwort
– Client sendet Kommando an den SMTP-Server
(z.B. "MAIL FROM:<[email protected]>\r\n")
– Server antwortet mit Status-Code
(z.B. "250 OK\r\n")
Java Praktikum – SS 2008 – [email protected]
15
Praktikum aus
Softwareentwicklung 2
Netzwerkprogrammierung
& Threads
• Netzwerkprogrammierung
– URL, URLConnection, UDP, TCP
• Threads
– Parallele Programme, Synchronisation, …
Java Praktikum – SS 2008 – [email protected]
16
Praktikum aus
Softwareentwicklung 2
Threads
Eigenschaften
• "Heavy-weight" Prozess
–
–
–
–
Adressraum
Ausführungszustand
Programmzähler, Ausführungs-Stack
eventuell mehrere Threads
• "Light-weight" Prozess (Thread)
– teilt sich den Adressraum mit seinem Parent und anderen Threads
– jeder Thread ist ein eigener, sequentieller Kontrollfluss mit einem
eigenen Programmzähler, Ausführungs-Stack und Zustand
– User-Thread
– Daemon-Thread: terminieren automatisch, wenn der letzte
nicht-Daemon Thread beendet wird
• Paralleler Ablauf des Parent-Prozesses und aller
Threads
Java Praktikum – SS 2008 – [email protected]
17
Praktikum aus
Softwareentwicklung 2
Threads
Implementierung von Threads
• Ableiten von der Klasse java.lang.Thread und
Überschreiben der Methode run
• Implementierung des Interfaces Runnable und
Übergabe des Objekts an ein Thread Objekt im
Konstruktor
class Clock implements Runnable {
public void run() { ... }
}
…
Clock clk = new Clock();
Thread clkThread = new Thread(clk).start();
Java Praktikum – SS 2008 – [email protected]
18
Praktikum aus
Softwareentwicklung 2
Threads
Beispiel: SimpleThread
Runnable
Thread
void run()
void start()
SimpleThread
void run()
Hauptprogramm von
SimpleThread
LeerImplement
ierung
VM erzeugt
OS-Thread
und ruft
run() auf
public class ThreeThreadsTest {
public static void main (String[]
args) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start();
new SimpleThread(„Bora").start();
}
}
Java Praktikum – SS 2008 – [email protected]
19
Praktikum aus
Softwareentwicklung 2
Threads
Lebenszyklus
Alive
wait
yield
Created
new
start
Running
sleep
[sleeptime is
over]
Suspended
notify[All]
interrupt
Stopped
Java Praktikum – SS 2008 – [email protected]
20
Praktikum aus
Softwareentwicklung 2
Threads
SimpleThread Sequenzdiagramm
ThreeThreadsTest:Class
main
new
start
new
jamaica:SimpleThread
run
fiji:SimpleThread
start
Java Praktikum – SS 2008 – [email protected]
run
21
Praktikum aus
Softwareentwicklung 2
Threads
Thread, Runnable und Object
<<interface>>
Object
notify ()
notifyAll ()
wait ()
...
Thread
<<realizes>>
Runnable
run()
Thread (name: String)
Thread (r: Runnable)
start ()
run ()
sleep (millis:long)
yield ()
interrupt ()
isInterrupted ()
join ()
isDaemon ()
setDaemon ()
...
Java Praktikum – SS 2008 – [email protected]
22
Praktikum aus
Softwareentwicklung 2
Threads
Beispiel: Time Server
public class TimeServer {
public static void main (String args[])
throws IOException {
ServerSocket server = new ServerSocket(1234);
while (true) {
System.out.println("Waiting for client...");
Socket client = server.accept();
System.out.println("Client from" +
client.getInetAddress() + "connected.");
TimeHandler handler = new TimeHandler(client);
new Thread(handler).start();
}
}
}
Java Praktikum – SS 2008 – [email protected]
23
Praktikum aus
Softwareentwicklung 2
Threads
Beispiel: Time Handler
public class TimeHandler implements Runnable {
private Socket client;
public TimeHandler(Socket _client) { client = _client; }
public void run () {
try {
DataOutputStream out = new DataOutputStream(
new BufferedOutputStream(client.getOutputStream()));
Date date = new Date();
System.out.println(date.toString());
out.writeUTF(date.toString());
out.flush();
client.close();
} catch (IOException e) { System.err.println(e); }
}
}
Java Praktikum – SS 2008 – [email protected]
24
Praktikum aus
Softwareentwicklung 2
Threads
Prioritäten
• Jeder Thread hat bestimmte Priorität
public final static int MAX_PRIORITY = 10;
public final static int NORM_PRIORITY = 5;
public final static int MIN_PRIORITY = 1;
• Priorität kann selbst definiert werden:
public final void setPriority(int np);
public final int getPriority();
• Thread mit höchster Priorität läuft bis zum ThreadEnde
• Scheduling nur für Threads mit gleicher Priorität
Java Praktikum – SS 2008 – [email protected]
25
Praktikum aus
Softwareentwicklung 2
Threads
Synchronisation (1/2)
• Schlüsselwörter
– Variablen: volatile
– Codeblöcke und Methoden: synchronized
Blöcke können auch verschachtelt sein
• Jedes Objekt hat einen Monitor (realisiert Lock)
– Eintritt in einen synchronized Block des Objekts nur
möglich, wenn Zählerstand des Monitors auf 0, bei Eintritt
wird Zählerstand erhöht.
– Nicht-synchronized Methoden können immer ausgeführt
werden.
– synchronized wird nicht vererbt
Object
Monitor
int count
holder
0..1
Thread
waiter
*
Java Praktikum – SS 2008 – [email protected]
26
Praktikum aus
Softwareentwicklung 2
Threads
Synchronisation (2/2)
• <Object>.wait()
– ein Thread, der einen Lock auf <Object> hat, wird
unterbrochen und kommt in eine Warteschlange
– Monitor wird freigegeben (Zähler auf 0 gesetzt)
• <Object>.notify() oder notifyAll()
– Ein Thread H (holder) gibt Zustandsänderung bekannt
– Ein Thread W (waiter) kommt aus der Warteschlange und
blockt, bis H Monitor freigibt durch:
• Beenden, bzw. Verlassen des synchronized Blocks
• Geht selbst in Warteposition mit wait()
– Wenn W Monitor erhält, wird er aktiviert
Java Praktikum – SS 2008 – [email protected]
27
Praktikum aus
Softwareentwicklung 2
Threads
Producer / Consumer Beispiel (1/2)
Consumer
Thread
Producer
Thread
put()
Data
Object
get()
• Consumer muss mit dem Lesen warten bis
aktuelle Daten vorhanden sind
• Producer muss mit dem Schreiben warten, bis
Consumer die aktuellen Daten abgeholt hat
Java Praktikum – SS 2008 – [email protected]
28
Praktikum aus
Softwareentwicklung 2
Threads
Producer / Consumer Beispiel (2/2)
Data
Producer
1
run ()
Wartet bis
Daten von C.
gelesen
val : int
newValue : boolean
get (): int
put (i:int)
class Producer extends Thread {
Data dat;
Producer(Data dat) {
this.dat = dat;
}
public void run() {
while (1==1) {
dat.put(i); ...
}
}
}
Consumer
1
run ()
Wartet bis
Daten von P.
geliefert
class Consumer extends Thread {
Data dat;
Consumer(Data dat) {
this.dat = dat;
}
public void run() {
while (1==1) {
System.out.println(dat.get());
...
}
}
}
Java Praktikum – SS 2008 – [email protected]
29
Praktikum aus
Softwareentwicklung 2
Threads
Implementierungsdetails (1/2)
• Schreiben auf Data
public synchronized void put(int i) {
while (newValue) {
try {
wait();
} catch(InterruptedException e) {}
}
val = i;
newValue = true;
notifyAll();
}
Java Praktikum – SS 2008 – [email protected]
30
Praktikum aus
Softwareentwicklung 2
Threads
Implementierungsdetails (2/2)
• Lesen von Data
public synchronized int get() {
while (!newValue) {
try {
wait();
} catch(InterruptedException e) {}
}
newValue = false;
notifyAll();
return val;
}
Java Praktikum – SS 2008 – [email protected]
31
Praktikum aus
Softwareentwicklung 2
Threads
Gruppen
• Gruppierung von Threads
• Gemeinsame Eigenschaften, gemeinsame
Manipulation
• Jeder Thread gehört zu einer Thread Gruppe
(Zuordnung bei Instanziierung)
public Thread(ThreadGroup group,String name)
public final ThreadGroup getThreadGroup()
• Klasse ThreadGroup
public
public
public
public
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent,String name)
static int enumerate(Thread[] tarray)
void destroy()
• Thread Gruppen können geschachtelt sein
(Baum) public ThreadGroup getParent()
Java Praktikum – SS 2008 – [email protected]
32
Praktikum aus
Softwareentwicklung 2
Ende der 3. Übung
Java Praktikum – SS 2008 – [email protected]
33
Herunterladen