9 Aktiva objekt och trådar

Relevanta dokument
Föreläsning 11. Trådar

Föreläsning 11. Trådar Trådsäkerhet

Föreläsning 14. Trådar. Trådar Trådsäkerhet. Aktiva objekt. Motivering

Föreläsning 7. Designmönstret Singleton. Designmönstret State. Trådar

Trådar. Aktiva objekt

Concurrency Saker händer samtidigt. Process En instans av ett program

Trådar. Motivering. Många program måste kunna hålla på med flera saker samtidigt, till exempel. fleranvändarsystem.

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Java TRÅDAR OCH GRAFIK. FAdil galjić

Exam Concurrent and Real-Time Programming

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Trådar och trådsäkerhet. Objekt-orienterad programmering och design Alex Gerdes, 2018

Parallellism, återblick

Tentamen Nätverksprogrammering Lösningsförslag

Föreläsning 3: Händelsestyrda program och användargränssnitt

Tentamen Nätverksprogrammering Lösningsförslag

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Objektorienterad Programkonstruktion. Föreläsning dec 2015

JAVAUTVECKLING LEKTION 4

Föreläsning 11 Aktiva objekt och trådar, strömmar, kommunikation DAT043,

Lösningsförslag till tentamen

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Tentamensskrivning Nätverksprogrammering (EDA095) , kl 8-13

Trådar och trådsäkerhet. Objekt-orienterad programmering och design Alex Gerdes, 2016

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Exceptionella händelser och trådar. Exceptionella händelser. (Undantag)

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

LÖSNINGSFÖRSLAG

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Realtidssystem. - Semaforer, trådsynkronisering - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 2

F4. programmeringsteknik och Matlab

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Tentamen ITK:P2. Inga hjälpmedel tillåtna förutom penna och papper. Skriv tydligt och texta gärna. 14 st frågor, 70 poäng.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen Nätverksprogrammering Lösningsförslag

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Software Technology. Josef Svenningsson

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Tentamen Nätverksprogrammering Lösningsförslag

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Lösningar för tenta 3 DAT043,

Klassen javax.swing.timer

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Realtidssystem. - Semaforer, trådsynkronisering - EDA698 - Realtidssystem (Helsingborg) Elin A. Topp

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Objektorienterad Programmering DAT043. Föreläsning 5 29/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Föreläsnings 9 - Exceptions, I/O

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Lösningsförslag till tentamen

Föreläsning 3. Stack

Tentamen LÖSNINGSFÖRSLAG

Uppgift 4. Uppgift 4. Uppgift 4. Uppgift 4. Uppgift 4. Uppgift 4. Syfte. Konstruktion av användargränssnitt. Deadline 14/3 kl 10.

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Tentamen EDA698 Realtidssystem (Helsingborg)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Properties. Användbara metoder som kan anropas i propertychanged:

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Att skriva till och läsa från terminalfönstret

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

lgammal2.txt // Lösningar till gammal tentamen // Uppgift 1 a

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

a. Vilka av följande påståenden är riktiga? Observera att felaktigt valda påståenden ger poängavdrag. (4p)

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 3. Stack

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen Nätverksprogrammering Lösningsförslag

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Polymorfi. Objektorienterad och komponentbaserad programmering

Lösningsförslag till tentamen

Realtidssystem. - Monitorer, synkroniserade metoder - EDA698 - Realtidssystem (Helsingborg) Elin A. Topp

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

TDDC77 Objektorienterad Programmering

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Transkript:

9 Aktiva objekt och trådar Skansholm kap 13 arallella program, processer och trådar Aktiva Swing-komponenter Trådar i Java Synkronisering Trådar och Swing arallella program och processer De flesta operativsystem tillåter samtidig exekvering av flera program i parallella processer rocessbyte 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 1 2 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 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 3 4 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); process 1 exekverar k.trans(-700); process 2 exekverar k.trans(2000); Möjligt scenario exekveringssteg variabel t1 t2 t3 t4 t5 k.saldo 1000 1000 1000 3000 300 x 1-700 -700-700 -700-700 nyttsaldo 1? 300 300 300 300 x 2 2000 2000 2000 2000 2000 nyttsaldo 2?? 3000 3000 3000 process 1 läser process 2 läser process 2 skriver process 1 skriver 5 Facit: 2300 borde det allt ha blivit. Byt bank! 6

assiva 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 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. 7 8 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) 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(); Anropas varje period ms public void stop() timer.stop(); public void actionerformed(actionevent e) System.out.println(++seconds); 9 10 Ex 2. Klocka med java.util.timer /** * run is called periodically by java.util.timer */ public class ClockTick extends TimerTask private long seconds = 0; public void run() System.out.println(++seconds); forts. Klocka med java.util.timer /** * 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(); Schemalägg tick.run() varje period ms 11 12

Trådklass med arv från Thread Trådklass med internt Thread-objekt public class MyThreadClass extends Thread //... public void run() while (! interrupted() ) try sleep(some time interval); catch (InterruptedException e) // Do some useful work here... 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) // Do some useful work here... 13 14 Exempel: skrivare Exempel: 2 skrivartrådar kör parallellt 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) System.out.println(text); // the actual work 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(); 15 16 Exempel: skrivare med java.util.timer 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; forts. skrivare med java.util.timer 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); 17 18

t.join() 2. gör något annat i den aktuella tråden under tiden Metoden join() i Thread Aktuell tråd väntar tills t har avslutats 1. Starta ett bakgrundsjobb i en egen tråd t 3. invänta bakgrundstråden t.join() 4. fortsätt 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) System.out.println("Background work... " + i++); sum += i; System.out.println("Background work finished"); public long getresult() return sum; 19 20 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) 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..."); //... Exempel: Job shop roducenter och konsumenter Buffring krävs eftersom trådarna kan arbeta i olika takt Exempel: Simulering av help desk roducenter 21 Synkroniserad kö Konsumenter C C C 22 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 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 23 24

SimpleQueue: En synkroniserad köklass Metoden SimpleQueue.take() 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 public synchronized T take() while (queue.isempty()) try wait(); catch (InterruptedException e) return null; T obj = queue.getfirst(); queue.removefirst(); return obj; 25 26 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); Jobshop-metoder public void createandstartthreads() threads.add( new roducer("lundin",6237,helpdeskqueue,jobgenerator)); threads.add( new roducer("von Hacht",2846,helpDeskQueue,jobGenerator)); threads.add( new roducer("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 createandstartthreads()... public void stopthreads()... public void stopthreads() for ( Thread t : threads ) t.interrupt(); 27 28 Class roducer public class roducer extends Thread private String name; private long interval; private SimpleQueue<String> queue; private JobGenerator jobgenerator; public roducer(... )... 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 ) queue.put(name + ": " + jobgenerator.pickrandomjob()); public void run() while (!interrupted()) try sleep(interval); catch (InterruptedException e ) System.out.println(name + " received job from + queue.take()); 29 30

Trådar och Swing rogram 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 actionerformed 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! 31