9 Aktiva objekt och trådar Skansholm kap 13

Slides:



Advertisements
Liknande presentationer
Interface.  Interface är en datatyp och har alltså egen syntax och en hel del egna regler för vad arv från interface innebär.  Interface är renodlad.
Advertisements

Avlusning Debugger (”avlusare”) Breakpoints Watch.
Next previous Internetprogrammering 2000 Internetprogrammering 2000 Föreläsning 10 Distribuerad programmering med Javas RMI, Remote Method Invocation.
Klassarv och inkapsling
OOP Objekt-orienterad programmering
Metoder i java Det finns två typer av metoder i java
Om Java C =>Java syntax variabler metoder färdiga klasser
Inkapsling.
Objektorienterad tänkande
Välkommen Vahid Mosavat
Programmeringsteknik för K och Media
1 ITK:P1 Föreläsning 4 Grafiska gränssnitt och händelsehantering DSV Peter Mozelius.
Strömmar Vid läsning och skrivning används något som kallas strömmar.
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Kap 3 & 4: Processer & trådar.
i olika programmeringsspråk
OOP F4:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 4 Metoder klass-metoder instans-metoder.
PROCESSPROGRAMMERING
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 4 ( )‏ Innehåll:Trådsäkerhet - Intrinsic locks och synkronisering - Synchronized statements.
int res2=Math.max(tal1,tal2);
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Vektorer (klassen Vector) Sortering
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: Trådprogrammering i Java - Avbrott (”interrupts”) - Metoden join() -
Programmeringsteknik för Media1 & K1
PROCESSPROGRAMMERING Föreläsning ‏ Innehåll: Högnivå objekt för trådprogrammering: - Trådgrupper (”Thread pools”)‏ - Exekverare (Executor.
PROCESSPROGRAMMERING Föreläsning ‏ Innehåll: Trådsäkerhet - Memory consitency error - Guarded blocks - Lock Objects - Immutable Objects -
OOP F3:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 3 Iteration Många variabler av samma sort – Arrayer.
Föreläsning 8 Arv och abstrakta klasser. Arv Definierar en klass utifrån en redan existerande klass Den nya klassen utökar den ärvda klassen ( extends.
1 Windows programmering Programmering med Threads Borland C++ Builder 4 Modsoft Ab Kent Westerholm.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
Föreläsning 14 ”Enkel” Filhantering.
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Kapitel 6: Process- synkronisering.
Next previous Innehåll Del 1-trådar Del 2-URLer Del 1: Trådar Föreläsning 8.
Next previous RMI, Remote Method Invocation Om du har boken av Marty Hall, läs avsnitt 15.8 För fler exempel se:
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Föreläsning 9 Gränssnitt. Super Super kan användas till anrop av en omdefinierad metod Super kan användas till anrop av konstruktorer i superklassen Super.
Föreläsning 4 Klasser Och Objekt.
1. Ett problem/uppgift.
Föreläsning 4 programmeringsteknik och Matlab 2D1312/ 2D1305
0. Kod, Klassdiagram och Sekvensdiagram import java.awt.event.*; import javax.swing.*; import java.awt.*; public class TwoThreads implements ActionListener.
PROCESSPROGRAMMERING Föreläsning 1 ( )‏ Innehåll: Introduktion till paralellprogrammering (“concurrent programming”)‏ Introduktion till parallellprogrammering.
Föreläsning 13 Appletprogram/fristående grafiska program Arv Rita linjer, rektanglar mm Skriva text, byta färg Appletprogram & HTML Grafiska användargränssnitt.
Föreläsning 9 Arv kap 8.1 Interface kap 9.2 Grafiska användargränssnitt (GUI) kap 10.
OOP F13:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 13 Repetition variabler, selektion och iteration.
Köer -- Kapitel 16. Principen med en kö Köer är FIFO datastrukturer  First In – First Out  enqueue() Lägg till data i kön (först)  dequeue() Hämta.
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 15: Parallella subrutiner Parallellitet Processer och trådar Semaforer, monitorer.
7. Delegerare och notifierare
F. Drewes, Inst. f. datavetenskap1 Föreläsning 15: Parallella subrutiner Parallellitet Processer och trådar Semaforer, monitorer och synkroniseringsmeddelanden.
Föreläsning 17 Repetition. Källkodsformat Unicode används åäöμψζ tillåtna i namn på identifierare Inte alla miljöer klarar av det Källkod Bytekod Java.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 2 ( )‏ Innehåll:Trådar: - Avbrott (”interrupts”)‏ - Metoden join()‏ Högnivå objekt för.
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Övning2 programmeringsteknik och Matlab 2D1312/ 2D1305
Övning 3. Repetition Metoder class RepetitionMetoder { public static void main(String [] args) double längd = 2.0; double bredd = 1.0; double area =
Programmeringsteknik för K och Media
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: -Exekveringstrådar.
OOP - teori1 OOP del II– Föreläsning 5 vecka 6. OOP - teori2 Klasser Substantiv i singularis stavat med stor bokstav till exempel Human Dog Account Circle.
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
OOP&M - teori1 OOP del III–vecka 15 Mer NetBeans MouseEvent Graphics Threads TIJ Chapter 14 Menus sid Drawing File Dialogs
OOP&M - teori1 OOP – Föreläsning 7 (Sista oop I) Konstruktioner för att hantera upprepningar Kapitel 11.
Chapter 11: Exception Handling F Exceptions and Exception Types F Claiming Exceptions F Throwing Exceptions F Catching Exceptions F Creating Your Own Exception.
OOP&M - teori1 OOPM del II– Föreläsning vecka Mer om ärvning.. Abstrakta klasser/metoder Gränssnitt/Interface klasser.
DA7351 Programmering 1 Skapa och placera en komponent i en container Layoutmanagers Applet Händelser och lyssnare Föreläsning 15.
OOP&M - teori1 OOPM del II – Föreläsning vecka Abstrakta klasser/metoder igen Gränssnitt/Interface klasser igen tillämpat.
Föreläsning 3: Booleans, if, switch
Föreläsning 15: Exceptions & lite swing, gränssnitt
Föreläsning 13: Swing (GUI), händelser, timer
Föreläsning 8: Exempel och problemlösning
Föreläsning 12: Exempel och problemlösning
12 Metaprogrammering i Java (Litteratur: se sista sidan)
JVM Java Virtual Machine
Repetitionsföreläsning 1: Lite rekursion & problemlösning
Presentationens avskrift:

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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 = 1+2+3+... 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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3

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, 2018-12-25 www.cse.chalmers.se/~holmer/ DAT055, 16/17, lp 3