parallel programming
Download
Skip this Video
Download Presentation
Parallel Programming

Loading in 2 Seconds...

play fullscreen
1 / 18

Parallel Programming - PowerPoint PPT Presentation


  • 86 Views
  • Uploaded on

Parallel Programming. Thread Synchronization. Heute. Lösung zu Assignment 2 Erstellen und Starten von Threads in Java Das synchronized Schlüsselwort in Java Ausblick auf Assignment 3. Live. 1. – Assignment 2. 2. – Starten von Threads in java. Threads erstellen.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Parallel Programming' - ervin


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
parallel programming

Parallel Programming

Thread Synchronization

heute
Heute
  • Lösung zu Assignment 2
  • Erstellen und Starten von Threads in Java
  • Das synchronized Schlüsselwort in Java
  • Ausblick auf Assignment 3
threads erstellen
Threads erstellen

Klasse java.lang.Thread

Zwei Möglichkeiten:

  • Interface Runnable
  • Thread.run überschreiben
interface runnable
Interface Runnable

publicinterfaceRunnable{voidrun();}

  • //in MyProcess.java
  • publicclassMyProcessimplementsRunnable {voidrun() {//what I wantthisthreadto doSystem.out.println(“Hellofromthread“); }

}

//whereyoustartthethread

MyProcess mp = newMyProcess();

Thread t = new Thread(mp);

t.start();

thread run berschreiben
Thread.run überschreiben
  • //in MyProcess.java
  • publicclassMyProcessextends Thread {voidrun() {//what I want this thread to doSystem.out.println(“Hello from thread“); }
  • }
  • //where you start the thread
  • MyProcess mp = newMyProcess();
  • mp.start();
was ist besser
Was ist besser?

Thread.run

+ Einfacher aufzusetzen

+ Mehr Kontrolle über das Thread-Objekt

  • Weniger flexibel (Vererbung)

Runnable Interface

+ Steht Vererbung nicht im Weg

+ Ist nicht an Threads gebunden

- Benötigt einen Schritt mehr zum Aufsetzen

threads auf eis
Threads auf Eis
  • try { //doze a random time (0 to 0.5 secs) tosimulateworkloadThread.sleep( (int)(Math.random()*500) );} catch (InterruptedException e) { … }
    • Thread.sleep(long) versetzen den aktuellen Thread für mindestens x Millisekunden in den sleep-Zustand.
    • Wozu InterruptedExcpetion?
ohne interruptedexception
Ohne InterruptedException

Thread A

Thread B

Thread.sleep(500)

Katastrophe

Zeit

mit interruptedexception
Mit InterruptedException

Thread A

Thread B

Thread.sleep(500)

Katastrophe

Zeit

intrinsic synchronized
„Intrinsic“ synchronized
  • publicclassBuffer {publicsynchronizedvoidwrite(int i) { … }publicsynchronizedintread() { … }}
    • Für Methoden
    • Thread muss zunächst exklusiven „lock“ erlangen
    • Jede Klasse und jedes Objekt hat einen „intrinsic lock“

Schliessen sich gegenseitig aus („mutual exclusion“), weil beide „this“ als „lock“ verwenden

synchronized block
synchronized Block
  • publicvoidsomeMethod1(){//do somethingbeforesynchronized(anObject) { … }//do something after}publicvoidsomeMethod2() {//do somethingbeforesynchronized(anObject) { … }//do something after}

Schliessen sich gegenseitig aus, weil beide das selbe Objekt als „lock“ verwenden

fragen
Fragen
  • Können statische methoden (staic) auch synchronized werden?
    • Was wäre das „lock object“?
  • Wieso Objekte als „locks“?
    • und nicht z.B. Zahlen, oder Strings?
noch mehr fragen
Noch mehr Fragen
  • publicvoidaddCustomer(DB db, Customer c) {synchronized(db) {addAddress(db, c.Address);db.newCustomer(c); }}publicvoidaddAddress(DB database, Address a) {db.verifyAddress(a);
  • synchronized(database) {db.newAddress(db, a); }}

Zweimal wird das DB-Objekt als „lock“ verwendet. Funktioniert das? Wieso? Wieso nicht?

das producer consumer beispiel
Das producer/consumer-Beispiel

Producer

Consumer

write()‏

  • Der „producer“ produziert ständig neue Werte und schreibt sie in einen gemeinsamen „buffer“
  • Der „consumer“ liest die Werte aus dem gemeinsamen „buffer“ und verwendet sie
  • Jeder Wert darf nur genau einmal konsumiert werden.
  • Die Frage: Wie synchronisiert man die zwei?

read()‏

write()‏

read()‏

Buffer

write()‏

read()‏

ad