240 likes | 444 Views
Thread-Programmierung in Java. Redner : Benjamin Hedoch, Natalia Koukk, Andreas Stadler, Song Wei, Mario Vöhl. Gliederung. Einleitung Unterschiede in der Implementierung Thread - Zustände Object - Lock und Sychronisation Code -Beispiel Links und Adressen.
E N D
Thread-Programmierung in Java Redner : Benjamin Hedoch, Natalia Koukk, Andreas Stadler, Song Wei, Mario Vöhl.
Gliederung • Einleitung • Unterschiede in der Implementierung • Thread - Zustände • Object - Lock und Sychronisation • Code -Beispiel • Links und Adressen Benjamin
EinleitungWofür braucht man Threads? • Konkurrierender Zugriff von mehreren Teilnehmern auf eine beschränkte Ressource. • Beispiel: Anzahl der Mikrofone zu Anzahl der Redner oder auch eure Aufmerksamkeit. • Prozessor – Zeit im Rechner Benjamin
Thread vs. Runnable java.lang.Thread implementiert das Interface java.lang.Runnable. • Die Spezifikation der Schnittstelle java.lang.Runnable und deren Implementierung in der Thread-Klasse ist sauberer OO-Stil. • In Java ist Mehrfachvererbung nicht möglich. • Durch das Erben der Thread-Klasse kann die erbende Klasse in diesem Vererbungsschritt keine weiteren Eigenschaften mehr erben. • Interfaces dagegen können beliebig implementiert werden. Natalia
Wann endet die Ausführung? • Sobald der Thread das Ende seiner run-Methoden erreicht, ist dieser beendet. • Um die Arbeit erneut auszuführen, ist eine neue Thread- Instanz zu erzeugen. • Das Erzeugen eines Threads bedarf größerer Anstrengungen für die JVM, einschließlich signifikantem Ressourcen-Verbrauch. Natalia
Thread-Prioritäten • Jeder Thread hat in Java eine Priorität • ein integer-Wert von 1 bis 10, wobei 1 die niedrigste und 10 die höchste Priorität darstellt. • Threads mit einer hohen Prioritäten werden vor Threads mit einer niedrigen Priorität abgearbeitet. • Ein Thread erbt die Priorität des Threads, von dem er erzeugt wird. Natalia
Thread-Prioritäten (2) • Der Scheduler verwendet die Priorität, um zu entscheiden, welchem bereiten Thread die CPU als nächstes zugeteilt wird. • Mit der Methode setPriority() wird die Priorität eines Threads gesetzt: • MAX_PRIORITY • NORM_PRIORITY • MIN_PRIORITY • Die Methode getPriority() liefert den aktuellen Wert. Natalia
Scheduling-Implementierungen • Es gibt zwei Ansätze für Scheduling-Strategien: • Preemtive • Time Sliced (bzw. Round Robin) • Beim preemtive Scheduling wird einem Thread die CPU entzogen, sobald ein anderer mit höherer Priorität in den Zustand Ready übergeht. • Beim time sliced Scheduling erhält jeder Thread ein gewisses Zeitquantum zur Ausführung. Natalia
Wird von Scheduler bestimmt Wird von Programm bestimmt Thread-Zustände allgemein Thread hat folgende Zustände: - Waiting - Ready - Running - Dead Andreas
Thread Waiting detailiert - Waiting Yielding - thread gibt freiwillig Ressource frei - geht sofort in Zustand Ready - Ready - Running - Dead Sleeping - thread gibt Ressource für definierte Zeit frei - geht erst nach Ablauf der Zeit in Zustand Ready Blocking - thread gibt Ressource frei und wartet auf Ereignis - geht erst nach Ereignis in Zustand Ready Andreas
Objekt-Lock und Synchronisation • Critical Section und synchronized • Objekt-Lock • Regeln den Zugriff : • parallelsequentiell Wei
Objekt-Lock und Synchronisation • Voraussetzung für den Zugriff: • Erhalten des Locks • Zustand wechseln: • Seeking-LockReady • Am Ende: Freigeben des Locks Wei
Objekt-Lock und Synchronisation • Zwei Möglichkeiten: • Synchronisation der gesamten Methode public synchronized void naechsterRedner(){ //… } • Synchronisation eines einzelnen Objekts public void setAktuellenRedner(){ synchronized (this){ aktuellerRedner = akt ; } } Wei
wait und notify - Koordination • Koordination zwischen Threads: • mit wait(), notify(), notifyAll() • Warte-Zustand: • wait(), • wait(long ms), • wait(long ms, int ns) Wei
wait und notify - Koordination • Drei Wege aus Warte-Zustand: • Ein anderer Thread signalisiert den Zustandwechsel mittels notify() bzw. notifyAll() • Die angegebene Zeit ist abgelaufen. • Ein anderer Thread ruft die Methode interrupt() des wartenden Threads auf. Wei
wait und notify - Koordination • Beispiel: public synchronized void aMethod(){while( ... ){ // gewünschter Zustand ?try{wait();}catch(InterruptedException ie){ ... }}// ...notifyAll();} Wei
Vortrag als Programm • Ressourcen: Mikro, Beamer, Aufmerksamkeit,... • Mehr Redner als Mikros etc. • Aufstellung eines Ablaufplanes • Plan als übergeordnetes Objekt • Redner stimmen ihre Aktionen mit dem Plan ab Mario
class Ablaufplan implements Runnable { private RednerThread eins, zwei,..., fuenf; privateThread zusammenThr; private Diskussion diskussion; privateint aktuellerPunkt; publicvoid setAktuellenPunkt(int akt) { synchronized (this) { aktuellerPunkt = akt; } } synchronized public void naechsterPunkt(){ aktuellerPunkt++; }
public Ablaufplan() { setAktuellenPunkt(1); diskussion = new Diskussion(this); diskussion.start(); } class RednerThread extendsThread { RednerThread(Ablaufplan koor,int nr){...} public void run() { while (koordinator.getAktuellenPunkt() != id) { synchronized(koordinator) { try { koordinator.wait(); } catch (InterruptedExceptioniEx) {} } } ... } zusammenThr = newThread(new Zusammenfassung(this)); zusammenThr.start(); class Diskussion extendsThread { Diskussion(Ablaufplan koordi) {koor = koordi;} publicvoid run() { while(koor.getAktuellenPunkt() != 7) yield(); ... } class Zusammenfassung implements Runnable { private Ablaufplan koordinator; synchronizedpublic voidrun() { try { while (true) wait(); } catch (InterruptedException interEx) {} ... } } fuenf = new RednerThread(this, 5); fuenf.start(); ... eins = new RednerThread(this, 1); eins.start();
Programmbeispiel Mario
In Klasse Ablaufplan public void run() { while (aktuellerPunkt < 3) { synchronized(this) { try { wait(500); } catch (InterruptedException iE) {} notify(); } } } In run von RednerThread public void run() { while (koordinator.getAktuellenPunkt() != id) { synchronized(koordinator) { try { koordinator.wait(); } catch (InterruptedException iEx) {} } } halteVortrag(); koordinator.naechsterPunkt(); } while (aktuellerPunkt < 6) { synchronized(this) { notifyAll(); } try { Thread.sleep(500); } catch (InterruptedException intEx) {} }...
In Klasse Ablaufplan public void run() { // ...alle Redner sind fertig zusammenThr.interrupt(); } // run In run von Diskussion (Thread) public void run() { while (koor.getAktuellenPunkt()!= 7) yield(); for (int i=0; i<5; i++) { System.out.println("...und diskutieren"); try { sleep(500); } catch (InterruptedExceptiongestoert) {} } System.out.println("...und gehen nach Hause"); } In run von Zusammenfassung (Runnable) synchronized public void run() { try { while(true)wait(); } catch (InterruptedException interEx) { System.out.println(‘‘Geweckt‘‘); } fasseZusammen(); koordinator.naechsterPunkt(); } // hier aktuellerPunkt == 7 try { diskussion.join(); } catch (InterruptedException gestoert) {}
Links und Email - Adressen • http://entwickler.com/itr/online_artikel/show.php3?nodeid=97&id=228 • Kontakt: • hedoch@mathematik.uni-marburg.de • voehl@mathematik.uni-marburg.de • koukk@mathematik.uni-marburg.de • stadler@mathematik.uni-marburg.de • songw@students.uni-marburg.de