Første |
|
|
Java Tråde (MultiServer) serie, Planche nr. 12 |
 |
Udskrift af : Java Tråde (MultiServer)
|
Planche 1 : Java Tråde (MultiServer)
Java har indbygget mekanismer for multiprogrammering
- Thread-klassen
- Runnable-interface
Koncepter:
- En tråds livscyklus
- Hvilken kode udføres i en tråd
- Beskyt delte data
Planche 2 : Livscyklus
En tråd kan være
- Running
- Ready
- forskellig afventende tilstande.
En tråd der er running skifter med:
- suspend()
- wait()
- sleep()
- søger utilgængelig lås
- forskellige (blocking) io-kald
En tråd bliver ready med
- notify()
- resume()
- lås bliver tilgængelig
- timeout
- IO klar
Planche 3 : Implementering
- Implementering af tråde er stærkt platformsafhæng
- kan være Pre-emptive (frivillig eller tvungen)
- kan være Round-Robin (tidsdelt)
- Prioriteter 1 til 10 (stærkest)
Planche 4 : Hvilken kode udføres
- Kode i run()-metoden, men...
- Er klassen nedarvet fra Thread?
- run()-metoden i underklassen
- implementere Runnable?
- run()-metoden i klassen, der implementerer
Planche 5 : Udvidede Thread
public class MinTraad extends Thread {
public void run() {
// denne kode udføres i tråden
}
}
Opret en tråd
- MinTraad min = new MinTraad();
Start den...
- min.start(); // ikke run()...
Planche 6 : Implementere Runnable
public class Spagetti extends Applet implements Runnable {
public void run() {
// trådet kode...
}
// andre definition, f.eks init()
}
Startes f.eks. i init() med
- Thread t = new Thread(this);
Eller fra et andet objekt
- Thread t = new Thread(refSpagetti);
Start med
Planche 7 : Når det er slut...
En tråd er død, når den
- afslutter run()-metode
- når tråden udfører stop()-metoden
- En død tråd kan ikke "genbruges"
Planche 8 : Flertrådede servere
EchoServer som gennemgået kan ikke håndtere flere requests samtidig.
Ved at give en request til en særlig servertråd, kan man håndtere flere:
Flyt den del af koden, som etablerer forbindelse og svarer en klient
over en trådklasses run()-metode
public class MultiServerTraad extends Thread {
private Socket socket = null;
public MultiServerTraad(Socket socket) {
super("MultiServerTraad");
this.socket = socket;
}
public void run() {
/*
* Åben PrintWriter out stream på ved hjælp af socket-variabel
* Resten som i EchoServer - inklusive close() på in, out og
* socket. Husk at håndtere evt. IOException
*/
}
}
Planche 9 : Kontrol-klassen
Den faste del
public class MultiServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listening = true;
...
serverSocket = new ServerSocket(4444);
while (listening) {
Socket sok = serverSocket.accept();
MultiServerTraad traad = new MultiServerTraad(sok);
traad.start();
}
serverSocket.close();
}
}
Eksemplet er forenklet (der mangler try-catch)
Planche 10 : Opgave
Ovennævnte tilfælde kan faktisk implementeres i en klasse definition.
(Hint: klassen MultiServer realiseres ikke nogen steder...)
1) Lav en klasse MultiServers, der kan håndtere flere requests.
2) Få serveren til at lukke ned via en request...
Planche 11 : Mere tråde
I ovennævnte eksempel synkroniserer trådene automatisk (via blocking io).
Tråde kan synkronisere med
- suspend() / resume() - Kun version 1.1.
- sleep() / kaster InterruptedException/løber ud
- wait() / notify() eller notifyAll()
Planche 12 : Beskytte delte data
- En datastruktur, der er delt mellem tråde
- En tråd opdatere et element
- tråden mister CPU
- Anden tråd opdatere andet element
- Data er inkonsistent!
Alle objekter har en - og kun en - lås (lock)
- Kun en tråd kan have et objekts lås ad gangen
- Kritiske regioner (metoder) markeres med synchronized nøgleord
Systemet sørger for, at kun en tråd er i en synchronized metode ad gangen - øvrige metoder bliver sat til at vente...
- Man kan også markere en blok i en metode synchronized
© 2000 BLA*net - Leif E. Andersen,
leander@blanet.dk
Første |
|
|
Java Tråde (MultiServer) serie, Planche nr. 12 |