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

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

Trådar. Aktiva objekt

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

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

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

9 Aktiva objekt och trådar

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

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

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

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

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

Rita Egna Bilder, Timer

Parallellism, återblick

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

Föreläsning 11. Trådar

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

Lösningsförslag till tentamen

Mer om grafiska komponenter. Händelsestyrda program

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

Lösningsförslag till tentamen

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

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

Laboration 15 Grafiskt användargränssnitt

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

Tentamen Nätverksprogrammering Lösningsförslag

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Malmö högskola 2007/2008 Teknik och samhälle

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

Tentamen Nätverksprogrammering Lösningsförslag

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

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

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

Laboration 24 Databasen MySQL och java

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

Föreläsning 8: Exempel och problemlösning

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Klasser som datastrukturer

Klassen javax.swing.timer

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

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

Lösningar för tenta 3 DAT043,

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers

Lösningsförslag till tentamen

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

Lösningsförslag till tentamen

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

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

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

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

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

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

Lösningsförslag till tentamen

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

Tentamen Nätverksprogrammering Lösningsförslag

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers. Exempel: FlowLayout. Klassen FlowLayout

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

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

Java TRÅDAR OCH GRAFIK. FAdil galjić

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

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

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

Repetitionsföreläsning 2: Quiz & problemlösning med swing Inget nytt material.

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

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

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

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

Inlämningsuppgift 1 Programmeringsteknik MN1 vt02

Tentamen Nätverksprogrammering Lösningsförslag

Lösningsförslag till tentamen

DAT043 Objektorienterad Programmering

Grafiska komponenter.

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

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

Lösningsförslag till tentamen

Den som bara har en hammare tror att alla problem är spikar

Föreläsning 12: Exempel och problemlösning

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Java: kort introduktion. Trådar. Något om mutex, Dekkers algoritm och monitorer. Javas ("inbyggda monitor") synchronized.

Lösningsförslag till tentamen

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

Software Technology. Josef Svenningsson

Objektorienterad Programmering (TDDC77)

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

Tentamen. Lösningsförslag

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

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

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Föreläsning 13: Swing (GUI), händelser, timer

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Transkript:

Motivering Uppsala Universitet 21 april 2005 Många program måste kunna hålla på med flera saker samtidigt, till exempel fleranvändarsystem en webserver som måste kunna leverera flera websidor samtidigt ett grafiskt system som ritar samtidigt som det arbetar med nästa bild ett system som reagerar på input samtidigt som det utför en beräkning Objectorienterad programmering Sida 1 Objectorienterad programmering Sida 3 Dagens ämnen Timers Synkronisering Buffrad kommunikation Producent/Konsument-exempel Hålla på med flera saker... en browser som kan börja visa dokumentet innan hela dokumentet är nerladdat ett program som kontrollerar olika delar av en maskin ett program som övervakar olika delar av ett system Det är inte nödvändigt att använda trådar, men ofta lättare. Objectorienterad programmering Sida 2 Objectorienterad programmering Sida 4

Aktiva objekt Aktiva objekt: objekt som själva kan initera skeenden. I Java finns det två sätt att beskriva aktiva objekt; javax.swing.timer kan användas för att kontrollera en grupp av aktiva objekt, om de bara behöver arbeta i korta moment. (Det finns även en liknande klass, java.util.timer.) med hjälp av trådar java.lang.thread kan man hantera objekt som arbetar i längre moment (eller kontinuerligt). Enkelt exempel testkörning svenolof@hamberg$ svenolof@hamberg$ javac.java svenolof@hamberg$ java -Djava.compiler=NONE ^C Objectorienterad programmering Sida 5 Objectorienterad programmering Sida 7 javax.swing.timer: Exempel public class implements ActionListener { public () { javax.swing.timer tim = new javax.swing.timer(1000, this); tim.start(); public void actionperformed (ActionEvent e) { System.out.println(""); public static void main (String [] arg) { h = new (); for (int i = 0; i<integer.max_value; i++) { new Timer(m, l) start() stop() restart() setdelay() setrepeats(false) Skapa en timer som genererar en händelse var mte millisekund, med l som lyssnare. Starta timern. Stanna timern. Återstarta. Ändra intervallet mellan händelser. Bara en händelse genereras. Objectorienterad programmering Sida 6 Objectorienterad programmering Sida 8

Digitalklocka (från Skansholm) public class DigitalKlocka extends JLabel implements ActionListener { private DateFormat df = DateFormat.getTimeInstance(); public DigitalKlocka () { sethorizontalalignment(jlabel.center); setopaque (true); setbackground(color.white); setfont(new Font("SansSerif", Font.BOLD, 24)); javax.swing.timer tim = new javax.swing.timer(1000, this); tim.start(); public class KlockDemo extends JFrame { private DigitalKlocka k1 = new DigitalKlocka(); private DigitalKlocka k2 = new DigitalKlocka("EST"); public static void main(string[] args) { KlockDemo kd = new KlockDemo(); Objectorienterad programmering Sida 9 Objectorienterad programmering Sida 11 public DigitalKlocka(String zon) { this(); df.settimezone(timezone.gettimezone(zon)); public void actionperformed(actionevent e) { settext (df.format (new Date())); public KlockDemo () { Container c = getcontentpane(); JLabel l1 = new JLabel("Lokal tid", JLabel.CENTER); JLabel l2 = new JLabel("New York", JLabel.CENTER); l1.setfont(new Font("Serif", Font.BOLD, 18)); l2.setfont(new Font("Serif", Font.BOLD, 18)); c.setlayout(new GridLayout(2,2,5,5)); c.add(k1); c.add(k2); c.add(l1); c.add(l2); setsize(500, 250); setvisible(true); setdefaultcloseoperation(exit_on_close); Objectorienterad programmering Sida 10 Objectorienterad programmering Sida 12

och processer Vad är en tråd? En ensam tråd liknar ett vanligt sekvensiellt program men när vi har flera trådar blir det intressant. Exempel: HotJava, en web-browser man kan scrolla en sida medan den laddar ner nånting stort I verkligheten kan flera saker pågå samtidigt, så varför inte i en dator?... är billigare används om man vill låta en applikation hålla på med flera saker samtidigt. Ibland används begreppet lättviktsprocess. Det är samma sak. Implementationer av Java brukar använda operativsystemets trådar. Objectorienterad programmering Sida 13 Objectorienterad programmering Sida 15 I alla moderna operativsystem finns processer och trådar Processer är dyra, har eget minnesskydd används om flera användare kör samtidigt... Schemaläggning (scheduling) Cooperative scheduling Tråden körs tills den frivilligt ger upp kontrollen. Preemptive scheduling Byte mellan trådar sker automatiskt....eller om en användare kör flera program Tex Windows 98 använder cooperatice scheduling om en process kraschar ska andra processer inte påverkas Alla moderna OS använder preemptimptive scheduling Objectorienterad programmering Sida 14 Objectorienterad programmering Sida 16

. Ett enkelt exempel class SimpleThread extends Thread { public SimpleThread(String str) { super(str); public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getname()); try { sleep((long)(math.random() * 1000)); catch (InterruptedException e) { System.out.println("DONE! " + getname()); public class TwoThreadsDemo { public static void main (String[] args) { new SimpleThread("Jamaica").start(); new SimpleThread("Fiji").start(); Objectorienterad programmering Sida 17 Objectorienterad programmering Sida 19 svenolof@harpo$ svenolof@harpo$ javac TwoThreadsDemo.java svenolof@harpo$ java TwoThreadsDemo 0 Jamaica 0 Fiji 1 Fiji 2 Fiji 1 Jamaica 2 Jamaica 3 Jamaica [...] 7 Jamaica 9 Fiji 8 Jamaica 9 Jamaica DONE! Fiji DONE! Jamaica svenolof@harpo$ Objectorienterad programmering Sida 18 Objectorienterad programmering Sida 20

Viktiga metoder Java.lang.thread start() Börja exekvering av nyskapad tråd sleep() Avbryt exekvering av tråd. Under den angivna tiden sover tråden yield() Ge en annan tråd möjlighet att köra Exempel: Primes.java En tråd beräknar primtal, en annan skriver ut det senast beräknade. Synkronisering Exempel: En enkel klass Konto: class Konto { private int saldo;.. public void transaktion( int belopp ) { saldo = saldo + belopp;.. Objectorienterad programmering Sida 21 Objectorienterad programmering Sida 23 Alternativt sätt att skapa och köra trådar I stället för att från klassen Thread, låt klassen K implementera interfacet Runnable En metod: run() K k = new K(); Thread t = new Thread(k); t.start(); Synkronisering (forts) Ett scenario med trådarna bankomat och girering. 1. Tråden bankomat anropar transaktion och har just beräknat saldo+belopp när den avbryts. 2. Tråden girering anropar transaktion, lägger till en summa och hinner ändra saldo 3. Tråden bankomat väcks och ger saldo sitt värde (ursprungligt saldo minus det uttagna beloppet). Objectorienterad programmering Sida 22 Objectorienterad programmering Sida 24

Synkronisering (forts) Efter dessa transaktioner : Saldot har minskat med det uttagna beloppet De insatta pengarna är borta (eftersom tråden girering var snabbare än tråden bankomat). För att eliminera risken att sådant här ska hända kan man deklarera metoder synchronized (som låser objektet) Metoden transaction skulle alltså deklareras synchronized public void transaktion(int belopp) { public class CubbyHole <T>{ private T contents; private boolean available = false; public synchronized T get() { while (available == false) { try { wait(); catch (InterruptedException e) { available = false; notifyall(); return contents; Objectorienterad programmering Sida 25 Objectorienterad programmering Sida 27 Hur kommunicerar två trådar? Enkel lösning: Ett objekt som båda kan se och uppdatera. Men hur upptäcker en process att ett objekt har uppdaterats? I klassen Object finns de tre metoderna wait() vänta till någon blir väckt, öppna låset notify() väck en väntande tråd notifyall() väck alla väntande trådar public synchronized void put(t value) { while (available == true) { try { wait(); catch (InterruptedException e) { contents = value; available = true; notifyall(); Objectorienterad programmering Sida 26 Objectorienterad programmering Sida 28

Producer public class Producer extends Thread { private CubbyHole<Integer> cubbyhole; private int number; public Producer(CubbyHole<Integer> c, int number) { cubbyhole = c; this.number = number; Consumer public class Consumer extends Thread { private CubbyHole<Integer> cubbyhole; private int number; public Consumer(CubbyHole<Integer> c, int number) { cubbyhole = c; this.number = number; Objectorienterad programmering Sida 29 Objectorienterad programmering Sida 31 Producer (forts) public void run() { for (int i = 0; i < 10; i++) { cubbyhole.put(i + this.number*10); System.out.println("Producer #" + this.number + " put: " + (i + this.number*10)); try { sleep((int)(math.random() * 100)); catch (InterruptedException e) { Consumer (forts) public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole.get(); System.out.println("Consumer #" + this.number + " got: " + value); try { sleep((int)(math.random() * 50)); catch (InterruptedException e) { Objectorienterad programmering Sida 30 Objectorienterad programmering Sida 32

ProducerConsumerTest public class ProducerConsumerTest { public static void main(string[] args) { CubbyHole<Integer> c = new CubbyHole<Integer>(); Producer p1 = new Producer(c, 1); Producer p2 = new Producer(c, 2); Producer p3 = new Producer(c, 3); Consumer c1 = new Consumer(c, 1); Consumer c2 = new Consumer(c, 2); p1.start(); p2.start(); p3.start(); c1.start(); c2.start(); Producer2: Använd Runnable class Producer2 implements Runnable { [...] private Thread t = null; public Producer2(CubbyHole<Integer> c, int number) { [...] this.t = new Thread(this); public void start() { t.start(); public void run() {... Objectorienterad programmering Sida 33 Objectorienterad programmering Sida 35 svenolof@harpo$ java5 ProducerConsumerTest Consumer #2 got: 10 Producer #3 put: 30 Consumer #1 got: 20 Producer #2 put: 20 Producer #1 put: 10 Consumer #1 got: 30 Producer #3 put: 31 Consumer #2 got: 21 Producer #2 put: 21 Consumer #1 got: 31 Producer #3 put: 32 Consumer #2 got: 32 Producer #1 put: 11 Consumer #1 got: 11 Producer #3 put: 33 Consumer #2 got: 33 Producer #2 put: 22 Consumer #1 got: 22 Producer #3 put: 34 Consumer #2 got: 34 Producer #1 put: 12 [...] Cubbyhole: testkörning Köer Ett gränssnitt: BlockingQueue Implementerande klasser LinkedBlockingQueue och ArrayBlockingQueue LBQ är obegränsad; ABQ har en maxstorlek (som anges i konstruktorn) Objectorienterad programmering Sida 34 Objectorienterad programmering Sida 36

Problem med trådar Köer, metoder void put(e) Sätt in e sist i kön <T>take() ta ut första elementet <T>poll() första elementet om det finns, annars null <T>poll(n,u) med timeout Producer-consumer exempel, med BlockingQueue Java använder normalt operativsystemets trådar. Tyvärr slår skillnader mellan olika OS igenom i beteendet hos olika trådade program. Detta innebär att man inte alltid kan flytta trådade program mellan maskiner. Om man glömmer att synkronisera kan man få problem med tidsberoenden (race conditions). Om man synkroniserar för mycket kan programmet hänga sig, till exempel om två processer har låst varsitt objekt som den andra processen behöver (deadlock). Objectorienterad programmering Sida 37 Objectorienterad programmering Sida 39, fler exempel PipeTest.java Kommunikation med en ström. Balls.java Ett mellanspel om dubbelbuffring Problem med trådar (forts) Synkronisering är en ganska dyr operation. är en knapp resurs en modern dator klarar några tusen. Main2.java Kontrollera ett objekt i rörelse. Att programmera med nära samverkande trådar är krångligt pga oförutsägbarhet i schedulering etc. Objectorienterad programmering Sida 38 Objectorienterad programmering Sida 40

: Några råd Låt multitrådade program följa enkla modeller, till exempel med buffrad kommunikation eller som den multitrådade servern i nästa föreläsning. Undvik situationer där många trådar läser och skriver samma objekt. Låt inte antalet trådar växa obegränsat. Objectorienterad programmering Sida 41 Sammanfattning Två sätt att programmera aktiva objekt. Timers relativt enkelt men inte så kraftfullt. kraftfullare men det finns många fallgropar. Objectorienterad programmering Sida 42