1 / 23

Thread-Programmierung in Java

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.

mare
Download Presentation

Thread-Programmierung in Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Thread-Programmierung in Java Redner : Benjamin Hedoch, Natalia Koukk, Andreas Stadler, Song Wei, Mario Vöhl.

  2. Gliederung • Einleitung • Unterschiede in der Implementierung • Thread - Zustände • Object - Lock und Sychronisation • Code -Beispiel • Links und Adressen Benjamin

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. Wird von Scheduler bestimmt Wird von Programm bestimmt Thread-Zustände allgemein Thread hat folgende Zustände: - Waiting - Ready - Running - Dead Andreas

  10. 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

  11. Objekt-Lock und Synchronisation • Critical Section und synchronized • Objekt-Lock • Regeln den Zugriff : • parallelsequentiell Wei

  12. Objekt-Lock und Synchronisation • Voraussetzung für den Zugriff: • Erhalten des Locks • Zustand wechseln: • Seeking-LockReady • Am Ende: Freigeben des Locks Wei

  13. 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

  14. wait und notify - Koordination • Koordination zwischen Threads: • mit wait(), notify(), notifyAll() • Warte-Zustand: • wait(), • wait(long ms), • wait(long ms, int ns) Wei

  15. 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

  16. wait und notify - Koordination • Beispiel: public synchronized void aMethod(){while( ... ){ // gewünschter Zustand ?try{wait();}catch(InterruptedException ie){ ... }}// ...notifyAll();} Wei

  17. 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

  18. 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++; }

  19. 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();

  20. Programmbeispiel Mario

  21. 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) {} }...

  22. 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) {}

  23. 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

More Related