Upload
meinrad-lazar
View
113
Download
2
Tags:
Embed Size (px)
Citation preview
Beispielanwendung von Java Threads
Vorträger:Koussetou Batawi
Proseminar
Inhalt
•Data Structures and containers
•Message Queue•The circular linked List (Doppelt verkettete Kreisförmige Liste)
•Simple Synchronization Examples•Beispielanwendung von der Klasse Barrier•Beispielanwendung von der Klasse ProcessIt
•A Network Server Class
Rolle der Message Queue
•MsgQueue ist eine Technik des IPC (Interprocess Communication) benutzt in Unix Systemen•Realisierung von Nachrichtenaustausch zwischen Threads in Java•Basiert auf der Vector-Klasse von Java
Zwei Methoden werden benutzt: •Eine Methode send(), um data zu anderem System zu schicken.- Eine Methode recv(), ist von einem System exekutiert damit eine data zu nehmen.
Message Queue
import java.util.* ;public class MsgQueue{
Vector queue = new Vector ();
public synchronized void send (Object obj){queue.addElement (obj) ;
}public Synchronized Object recv() {
if (queue.size() == 0)return null;Object obj = queue.firstElement();
queue.removeElementAt (0);return obj;
}}
Circular Linked List
• Container-Klasse• Doppeltverkettete Liste• Operationen
– Insert– Delete– Find– Locate– Get
Beipiel:Modell Entwurf
nextprev
data
nextprev
data
next
prev
data
Class CircularListNode{
Object 0;
CircularListNode next;
CircularListNode prev;
}
Methode insert();Public class CircularList{ pivate CircularListNode current; public synchronized void insert (Object o){ CircularListNode tn = new CircularListNode(); tn.o = 0; if(current = = null){ tn.next = tn.prev = tn; current = tn; }else{ tn.next = current; tn.prev = current.prev; current.prev.next = tn; current.prev = tn; }}• Rolle-Einfügen von Daten in der Liste.-Ein Arbeitzeiger der Klasse CircularListNode,der auf den Knotenpunkt zeigt hinter dem ein neues Element eingefügt wird
public synchronized void delete(Object o){ CircularlistNode p = find(o); CircularlistNode next = p.next; CircularlistNode prev = p.prev; if(p = = p.next){ current = null; return;} prev.next = next; next.prev = prev; if(current = = p) current = next;
•Rolle -Löschen eines Elements aus der Liste indem man das Element in Parameter eingibt. -Suche des Element in der Liste, -Löschen des Elements.
Methode delete
Methode find
Private CircularlistNode find(Object o){ CircularlistNode p = current; if(p = = null); throw new IllegalArgumentException(); do { if(p.o = = o) return p; p = p.next; }While (p = = current); throw new IllegalArgumentException();}
• Rolle -Suche nach bestimmten Element durch die Liste. - Zurückgabe des Elements -Fehler Meldung sonst.
Methode locate();
public synchronized Object locate (Object o) { CircularlistNode p = current; do{ if(p.o.equals(o)) return p.o; p = p.next; } While (p! = current); throw new IllegalArgumentException(); }
• Rolle-suche nach einem bestimmten Datensatz in der Liste-Übergabe des Datensatzes als Parameter an die Methode.
Methode getnext();
Public Synchronized Object getNext() { if (current = = null); return null; current = current.next; returncurrent.o; }}
• Rolle-Ausgabe des Datensatzes des Knoten nach dem Arbeitspeicher.-Incrementierung des Arbeitspeichers um eins.-Ausgabe des Datensatzes von Arbeitspeicher.
x 21 3
1x
2
3
Thread unsafeProblem: Paralleles Einfügen und Löschen
1 32
insert (x)delete (2)
2 3
1 2 3
1
x
x
INSERT();
1 x 3
DELETE();
Die Methoden sind synchronisiert
Thread safe Realisierung
Thread safe Implementierung
• Performance Aspekte
• Nachteil: Zeitaufwand
• Vorteil: korrektes Verhalten bei mehreren Threads
• Containerklassen in Java 2, thread unsafe Realisierungen collection classes
Wait Notify Synchronization
• Generell– Wait und notify können nur innerhalb einer
synchronisierten Region ausgeführt werden.
– Sie beziehen sich auf das entsprechend gesetzte Lock.
• Methode wait( )– Blockiert thread und gibt lock frei
• Methode notify( )– Weckt einen wartenden Thread auf.
– Dieser wartet aber auf lock.
• Methode notifyAll( )– Weckt alle artenden Threads auf.
Barrier
• Synchronisation aller Threads• Barrier-Klasse• Mehrere Synchronisationspunkte werden durch
eigene Barrier-Objekte realisiert.
Barrier: WaitForRest
class barrier { private int threads2wait4; ..... public Synchronized int waitForRest(){ int threadNum = --threads2wait4;
if(threads2wait4 <= 0){ notifyAll(); return threadNum; }
if (threads2Wait4>0){ wait(); return threadNum; } } }
Vergleich zwischen Barrier und join() Methoden
Thread 1
Thread 2
Thread 3
Thread 4
Thread 1
Thread 2
Thread 3Thread 4
Thread 1
Thread 5
Thread 6Thread 7
Thread 1
Thread 2
Thread 3
Thread 4
Methode Join();Class Thread1 implement Runnable{ Thread2 aufgabe2; Thread3 aufgabe3; Thread4 aufgabe4; .... public void runn( ){ aufgabe2 = new Thread2; aufgabe2.start( ); aufgabe3 = new Thread3; aufgabe3.start( ); aufgabe4 = new Thread4; aufgabe4.start( ); aufgabe1(); aufgabe2.join(); aufgabe3.join(); aufgabe4.join(); ... }}
class Thread1 implements Runnable{ ... Thread4 aufgabe4; Thread5 aufgabe5; Thread6 aufgabe6; Thread7 aufgabe7; Public void runn( ){ ... aufgabe4.join();
aufgabe5 = new Thread5; aufgabe5.start( ); aufgabe6 = new Thread6; aufgabe6.start( ); aufgabe7 = Thread7; aufgabe7 .start( ); aufgabe5.join(); aufgabe6.join(); aufgabe7.join(); }}
Barrier Beispielpublic class processIt implement Runnable{ Barrier bp1=new(4); Barrier bp1b=new(4); Barrier bp2=new(4); Barrier bp2b=new(4); Barrier bpStart=new(4); Barrier bpEnd=new(4);
public void runn(){ int I = bpStart.waitForRest();
doPhaseOne(is [i] ); if(bp1.waitForRest() == 0) doPhaseTwoSetup(); bp1b.waitForRest(); doPhaseTwo(is[i]); if(bp2.waitForRest() == 0) doPhaseThreeSetup(); bp2b.waitForRest(); doPhaseThree(is[i]); bpEnd.waitForRest(); }}
Vor- und Nachteile von Barrier
• Nachteile:zeit aufwand bei Thread Implementierung mit Barrier Klasse.
• Vorteile:In dieser java Bibliothek sind Methoden synchronisiert also verfügbar überall
A Network server class
Clt1 soc
Clt2 soc
Cltn soc
Socket(server)
Socket(data)
Socket(data)
Socket(data)Socket(data)
Verbindung zwischen Clients und Server
Class TCPserver
Import java.net.* ; Import.io.* ;
public class TCPServer implements cloneable,Runnable{ Thread runner = null; serverSocket server = null; socket data = null; boolean shouldStop = false; public synchronized void startServer (int port) throws IOException{ if(runner = = null){ server = new serverSocket(port); runner = new Thread(this); runner.start(); } }
Methode stopServer
public synchronized void stopServer( ){ if(server != null) { shouldStop = true; runner.interrupt( ); runner = null; try{ server closed( ); }catch (IOException ioe){ } server = null; } }
Methode runpublic void run(){ if(server != null){ While(!shouldStop){ Try{ Socket datasocket = server.accept(); TCPServer newSocket = (TCPServer) close(); newsocket.server = null; newsocket.data = datasocket ; newsocket.runner = new Thread(newSocket); newsocket.runner.start(); }catch{Exception e} {} } }else{ run(data); } }public void run socket data{ } }.
Zusammenfassung
• Data structures and Containers :– Mit MsgQueue ;eine Technik des IPC in Unix,damit erzeugenes
objekt zwischen threads passt– Implementierung einer Doppelt Verkettete Kreisförmige Liste und
das Speichern von zusammengehörenden Daten.• Simple Synchronization Examples
– mit Anwendung von Barrier wo die wait(),notify()und notifyAll() Methoden sind benutzt und machen den Unterschied zwischenSafe und Unsafe Threads.
– Barrier ist von ProcessIt Class benutzt– Da wird auch einen Vergleich zwischen Barrier Klasse und join()
Methode gemacht.• Network Server Class
– Diese Klasse zeigt die Beziehung zwischen Clients und Server