Presentation laddar. Vänta.

Presentation laddar. Vänta.

9 Aktiva objekt och trådar Skansholm kap 13

Liknande presentationer


En presentation över ämnet: "9 Aktiva objekt och trådar Skansholm kap 13"— Presentationens avskrift:

1 9 Aktiva objekt och trådar Skansholm kap 13
Objektorienterade applikationer d2, förel. 9 9 Aktiva objekt och trådar Skansholm kap 13 Parallella program, processer och trådar Aktiva Swing-komponenter Trådar i Java Synkronisering Trådar och Swing © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

2 Parallella program och processer
Objektorienterade applikationer d2, förel. 9 Parallella program och processer De flesta operativsystem tillåter samtidig exekvering av flera program i parallella processer Processbyte i OS är en resurskrävande operation Ett parallellt program har flera exekveringspunkter Ett realtidsprogram är ett (parallellt) program med tidskrav Ex. program för övervakning och styrning Pseudoparallellism (såvida man inte har en parallelldator med många processorer (concurrency)). Parallellism i ett program kan åstadkommas mha OS-primitiver, tex fork och wait. Plattformsberoende. Ineffektivt pga att processbyten är relativt dyra. Tidskrav kan var krav på snabbhet, men också exakthet (passning) © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

3 Objektorienterade applikationer d2, förel. 9
Trådar En tråd är en ”lättviktsprocess” där parallellismen administreras internt av programspråkets eget exekveringsmaskineri till en lägre kostnad än hantering av OS-processer Trådar tilldelas exekveringstid i turordning (time-slicing) Trådar kan exekveras med olika prioritet Vissa programmeringsspråk, t.ex. Ada, har inbyggda språkkonstruktioner för parallellprogrammering I Java utförs parallellprogrammering med aktiva objekt Man hoppar mellan exekveringspunkterna. Trådar delar samma adressrum. Turordning kan betyda olika saker … Sista punkten: Java liknar SIMULA i det avseendet: parallellism implementeras med klasser © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

4 Korrekthetsproblem i parallella program
Objektorienterade applikationer d2, förel. 9 Korrekthetsproblem i parallella program När flera processer exekverar samtidigt i olika inbördes hastigheter finns risk för komplikationer Låsning: Flera processer väntar i evighet på respons från varandra eller på tillgång till en gemensam resurs Svält: En process hindras varaktigt från att göra framsteg Inkonsistens: När flera processers operationer på en gemensam resurs överlappar i tiden kan resultatet bli felaktigt även om de enskilda operationerna utförs korrekt var för sig Resurs: objekt, minnesarea,… Lösning: synkronisering © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

5 Exempel: Felaktig banktransaktion
Objektorienterade applikationer d2, förel. 9 Exempel: Felaktig banktransaktion public class Konto { private long saldo; public Konto(long startBelopp) { saldo = startBelopp; } public void trans(long x) { long nyttSaldo = saldo + x; if ( nyttSaldo >= 0 ) saldo = nyttSaldo; } } ... Konto k(1000); Antag att flera processer får tillgång till k samtidigt, utan restriktioner © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

6 Objektorienterade applikationer d2, förel. 9
Möjligt scenario variabel exekveringssteg t1 t2 t3 t4 t5 k.saldo 1000 3000 300 process 1 exekverar k.trans(-700); x1 -700 nyttSaldo1 ? process 2 k.trans(2000); x2 2000 nyttSaldo2 läser skriver Processerna kan t.ex. exekveras på var sin bankomat Varje anrop har sina egna lokala variabler Lösning: synkronisering … men då får man de två andra problemen (låsning, svält)  Objektet borde vara låst under hela anropet av trans Facit: 2300 borde det allt ha blivit. Byt bank! © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

7 Passiva och aktiva objekt
Objektorienterade applikationer d2, förel. 9 Passiva och aktiva objekt Ett passivt objekt utför inget på eget initiativ utan reagerar enbart på metodanrop från omgivningen Ett aktivt objekt exekverar autonomt sin egen algoritm. men kan även manipuleras med metoder Ett parallellt objektorienterat program har flera aktiva objekt Ett aktivt objekt kan givetvis också ha vanliga metoder. © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

8 Aktiva objekt och trådar i Java
Objektorienterade applikationer d2, förel. 9 Aktiva objekt och trådar i Java Aktiva objekt exekveras i trådar En tråd per aktivt objekt Enkla aktiva objekt kan styras med hjälp av en timer utan extra trådar En Timer exekveras i en egen bakgrundstråd. generar händelser av typen ActionEvent. T.ex. rörliga swing-komponenter © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

9 Några standardklasser i Java för parallellprogrammering
Objektorienterade applikationer d2, förel. 9 Några standardklasser i Java för parallellprogrammering Klasser Användning javax.swing.Timer objekt java.util.Timer objekt java.util.TimerTask arv java.lang.Thread objekt, arv Abstrakta gränssnitt java.lang.Runnable arv (implement) © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

10 Ex 1. Klocka med javax.swing.Timer
Objektorienterade applikationer d2, förel. 9 Ex 1. Klocka med javax.swing.Timer import javax.swing.*; import java.awt.event.*; /** * A clock based on javax.swing.Timer */ public class Clock implements ActionListener { private long seconds = 0; private final int period = 1000; javax.swing.Timer timer = new javax.swing.Timer(period,this); public void start() { timer.start(); } public void stop() { timer.stop(); public void actionPerformed(ActionEvent e) { System.out.println(++seconds); Anropas varje period ms Alla timer-objekt körs i samma tråd. Inte samma tråd som händelsetråden Projekt: enkel_klocka Klass: SwingClock © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

11 Ex 2. Klocka med java.util.Timer
Objektorienterade applikationer d2, förel. 9 Ex 2. Klocka med java.util.Timer import java.util.*; /** * run is called periodically by java.util.Timer */ public class ClockTick extends TimerTask { private long seconds = 0; public void run() { System.out.println(++seconds); } Objektet måste schemaläggas (se nästa bild) Projekt: enkel_klocka Klasser: Clock, ClockTick © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

12 forts. Klocka med java.util.Timer
Objektorienterade applikationer d2, förel. 9 forts. Klocka med java.util.Timer import java.util.*; /** * A clock based on java.util.Timer */ public class Clock2 { private final int delay = 1000; private final int period = 1000; java.util.Timer timer = new java.util.Timer(); ClockTick tick = new ClockTick(); public Clock2() { timer.schedule(tick,delay,period); } public void stop() { timer.cancel(); tick.cancel(); Varje Timer har sin egen tråd. anv. Object.wait() Schemalägg tick.run() varje period ms © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

13 Trådklass med arv från Thread
Objektorienterade applikationer d2, förel. 9 Trådklass med arv från Thread public class MyThreadClass extends Thread { // ... public void run() { while ( ! interrupted() ) { try { sleep(some time interval); } catch (InterruptedException e) { break; // Do some useful work here ... Objektet är ett trådobjekt OBS! Bara metoder som anropas direkt eller indirekt av run() körs i tråden. Alltså körs inte objekt i trådar utan metoder. (ej riktigt OOP) InterruptedException kastas t.ex. om interrupt() anropas för tråden när den sover, annars sätts en flagga som kan läsas av med interrupted(). © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

14 Trådklass med internt Thread-objekt
Objektorienterade applikationer d2, förel. 9 Trådklass med internt Thread-objekt public class MyThreadClass implements Runnable { private Thread activity = new Thread(this); // ... public void run() { while ( ! Thread.interrupted() ) { try { Thread.sleep(some time interval); } catch (InterruptedException e) { break; // Do some useful work here ... Objektet har ett trådobjekt Använd detta alternativ om klassen skall ärva någon annan klass. Java har ju inte multipelt arv. Klassen måste implementera gränssnittet Runnable Metoden run måste ju finnas © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

15 Objektorienterade applikationer d2, förel. 9
Exempel: skrivare public class Writer extends Thread { String text; private long interval; // ms public Writer(String text,long interval) this.text = text; this.interval = interval; } public void run() { while ( ! interrupted() ) { try { sleep(interval); catch (InterruptedException e) { break; System.out.println(text); // the actual work Projekt: skrivare_med_arv Klass: Writer Start anropar run Kör ett objekt först! © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

16 Exempel: 2 skrivartrådar kör parallellt
Objektorienterade applikationer d2, förel. 9 Exempel: 2 skrivartrådar kör parallellt public class TwoWriterThreads { private Writer s1 = new Writer("C++ is best!",1122), s2 = new Writer("Java is better...",738); public TwoWriterThreads() s1.start(); s2.start(); } public void stop() { s1.interrupt(); s2.interrupt(); Projekt: skrivare_med_arv Klasser: Writer, TwoWriterThreads (Det finns också ett motsvarande exempel med internt Thread-objekt) © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

17 Exempel: skrivare med java.util.Timer
Objektorienterade applikationer d2, förel. 9 Exempel: skrivare med java.util.Timer import java.util.*; public class Writer2 extends TimerTask { String text; int count = 0; public Writer2(String text) this.text = text; } public void run() { System.out.println(text); count++; public int getCount() { return count; Projekt: skrivare_med_util_Timer Klass: Writer2 © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

18 forts. skrivare med java.util.Timer
import java.util.*; public class TwoWriters { private Timer t = new Timer(); private Writer2 s1 = new Writer2("C++ is best!"), s2 = new Writer2("Java is better..."); public TwoWriters() throws InterruptedException // schemalägg de två objekten t.schedule(s1,0,738); t.schedule(s2,0,1122); } public void stop() { s1.cancel(); s2.cancel(); t.cancel(); System.out.println("s1: " + s1.getCount() + ", s2: " + s2.getCount()); System.exit(0); Projekt: skrivare_med_util_Timer Klass: Writer2, TwoWriters © Uno Holmer, DIT, Chalmers,

19 Metoden join() i Thread
Objektorienterade applikationer d2, förel. 9 Metoden join() i Thread t.join() Aktuell tråd väntar tills t har avslutats 3. invänta bakgrundstråden t.join() 2. gör något annat i den aktuella tråden under tiden 4. fortsätt 1. Starta ett bakgrundsjobb i en egen tråd t © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

20 Exempel: bakgrundsjobb med join()
Objektorienterade applikationer d2, förel. 9 Exempel: bakgrundsjobb med join() public class BackgroundJob extends Thread { private int maxSteps = 0; private long sum = 0; // Calculate sum = private long interval; public BackgroundJob(long interval,int maxSteps) this.maxSteps = maxSteps; this.interval = interval; } public void run() { int i = 1; while ( i <= maxSteps && ! interrupted() ) { try { sleep(interval); } catch (InterruptedException e) { break; } System.out.println("Background work... " + i++); sum += i; System.out.println("Background work finished"); public long getResult() { return sum; Obs sleep här används bara i demonstrationssyfte. Projekt: foreground_background Klass: BackgroundJob © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

21 forts. bakgrundsjobb med join()
Objektorienterade applikationer d2, förel. 9 forts. bakgrundsjobb med join() public class Main { private BackgroundJob backgroundJob = new BackgroundJob(1000,10); public Main() { backgroundJob.start(); // Start background thread foregroundJob(); // Do foregroundjob in parallel } public void foregroundJob() { int i = 0; while ( i <= 20 && ! interrupted() ) { try { sleep(200); } catch (InterruptedException e) { break; } System.out.println("Foreground: " + i++); // work, work, work, ... // Now wait for background job to finish before continuing foreground job try { backgroundJob.join(); } catch(InterruptedException e) { } System.out.println("Background result: " + backgroundJob.getResult() ); System.out.println("Foreground work continues..."); // ... Obs sleep här används bara i demonstrationssyfte. Projekt: foreground_background Klass: Main Demo: 1. Fg med 200 ms gör att Fg får invänta Bg 2. med 600 ms hinner Bg klart först © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

22 Objektorienterade applikationer d2, förel. 9
Exempel: Job shop Producenter och konsumenter Buffring krävs eftersom trådarna kan arbeta i olika takt Exempel: Simulering av help desk P C Synkroniserad kö Producenter Konsumenter © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

23 Objektorienterade applikationer d2, förel. 9
Synkronisering När flera trådar delar en gemensam resurs krävs ömsesidig uteslutning vid access till resursen Metodsynkronisering i Java synchronized När en synkroniserad metod exekveras är objektet låst för anrop av synkroniserade metoder från andra objekt Det låsta objektet vaktas av en monitor Endast det objekt som äger objektets monitor får exekvera synkroniserade metoder på objektet Synkroniserade metoder får dock anropas för andra objekt av klassen Ett objekt som kör en synkroniserad metod skyddas av en Monitor. När en synkroniserad metod körs blir tråden ägare till objektets monitor. Trådsäker kod Andra saker kan synkroniseras: variabler m.m. © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

24 Metoderna notifyAll() och wait()
Objektorienterade applikationer d2, förel. 9 Metoderna notifyAll() och wait() notifyAll() signalerar till alla andra trådar som väntar vid detta objekts monitor att objektet ändrats wait() suspenderar tråden och öppnar låset för objektet andra trådar får exekvera synkroniserade metoder tråden väcks när någon tråd anropar notifyAll för objektet Vi pratar om samma objekt här Metoderna finns i Object. Notify och Wait skall bara användas av en tråd som äger ett objekts monitor. I huvudsak genom att exekvera en synkroniserad metod. Notify: En tråd (godt.) som väntar vid detta objekts monitor väcks. Wait: En tråd som exekverar wait väntar vid objektets monitor. © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

25 SimpleQueue: En synkroniserad köklass
Objektorienterade applikationer d2, förel. 9 SimpleQueue: En synkroniserad köklass public class SimpleQueue<T> { private LinkedList<T> queue = new LinkedList<T>(); public int size() { return queue.size(); } public synchronized void put(T obj) { queue.add(obj); notifyAll(); public synchronized T take() { ... nästa bild Obs typvariabeln! Synchronized i muterande metoder. Projekt: jobshop © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

26 Metoden SimpleQueue.take()
Objektorienterade applikationer d2, förel. 9 Metoden SimpleQueue.take() public synchronized T take() { while (queue.isEmpty()) { try { wait(); } catch (InterruptedException e) { return null; T obj = queue.getFirst(); queue.removeFirst(); return obj; Placera alltid wait i en loop så att villkoret testas om tråden väcks av andra skäl © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

27 Objektorienterade applikationer d2, förel. 9
Exempel: Jobshop public class JobShop { private SimpleQueue helpDeskQueue = new SimpleQueue<String>(); private JobGenerator jobGenerator = new JobGenerator(); private ArrayList<Thread> threads = new ArrayList<Thread>(); public JobShop() throws InterruptedException { createAndStartThreads(); // sleep while the simulation is running Thread.sleep(20000); stopThreads(); System.out.println("Jobs left in queue: " + helpDeskQueue.size()); System.exit(0); } public void createAndStartThreads() { ... } public void stopThreads() { ... } Obs typinstansen String i SimpleQueue © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

28 Objektorienterade applikationer d2, förel. 9
Jobshop-metoder public void createAndStartThreads() { threads.add( new Producer("Lundin",6237,helpDeskQueue,jobGenerator)); new Producer("von Hacht",2846,helpDeskQueue,jobGenerator)); new Producer("Holmer",1239,helpDeskQueue,jobGenerator)); threads.add(new Consumer("Erik",982,helpDeskQueue)); threads.add(new Consumer(”Mikael",1654,helpDeskQueue)); for ( Thread t : threads ) t.start(); } public void stopThreads() { t.interrupt(); © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

29 Objektorienterade applikationer d2, förel. 9
Class Producer public class Producer extends Thread { private String name; private long interval; private SimpleQueue<String> queue; private JobGenerator jobGenerator; public Producer( ... ) { ... } public void run() { while (!interrupted()) { try { sleep(interval); } catch (InterruptedException e ) { break; queue.put(name + ": " + jobGenerator.pickRandomJob()); © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

30 Objektorienterade applikationer d2, förel. 9
Class Consumer public class Consumer extends Thread { private String name; private long interval; private SimpleQueue<String> queue; public Consumer( ... ) { ... } public void run() { while (!interrupted()) { try { sleep(interval); } catch (InterruptedException e ) { break; System.out.println(name + " received job from ” queue.take()); © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3

31 Objektorienterade applikationer d2, förel. 9
Trådar och Swing Program som använder Swing har en händelsetråd (event-dispatching-thread) som exekverar all kod som förändrar swing-komponenter, t.ex. anropas actionPerformed från händelsetråden. Operationer som förändrar en Swing-komponent efter första uppritningen skall exekveras av händelsetråden. Sådan kod bör alltså anropas från lyssnarmetoder. Resurskrävande beräkningar som startas från Swing riskerar att ”lagga” GUI:t sådana beräkningar kan köras i bakgrunden med hjälp av standardklassen SwingWorker Var försiktig med att kombinera egna trådar med Swing! Gäller efter det att komponenten ritats upp första gången. (Efter pack() och setVisible()) © Uno Holmer, DIT, Chalmers, DAT055, 16/17, lp 3


Ladda ner ppt "9 Aktiva objekt och trådar Skansholm kap 13"

Liknande presentationer


Google-annonser