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

Relevanta dokument
Trådar. Aktiva objekt

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

Föreläsning 11. Trådar

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

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

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

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

Parallellism, återblick

Chapter 4: Writing Classes/ Att skriva egna klasser.

Tentamen Nätverksprogrammering Lösningsförslag

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

Checklista som kan anva ndas för att komma igång med DigiExam och allma nna rekommendationer fo r att lyckas med provtillfa llet.

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

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

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

9 Aktiva objekt och trådar

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

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

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

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

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

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

Tentamen Nätverksprogrammering Lösningsförslag

Classes och Interfaces, Objects och References, Initialization

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

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

F4. programmeringsteknik och Matlab

Enkla variabler kontra referensvariabel

Tentamen Nätverksprogrammering Lösningsförslag

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

Mer om klasser och objekt

Java TRÅDAR OCH GRAFIK. FAdil galjić

Bosgårdsskolans IKT-plan Lust, lärande och framtidstro 2013

JAVAUTVECKLING LEKTION 4

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

DAT043 Objektorienterad Programmering

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

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Grundläggande programmering med C# 7,5 högskolepoäng

PROGRAMMERINGSTEKNIK TIN212

Skapa remissvar till regeringen, skicka för godkännande, godkänna, diarieföra och skicka svar

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

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

Tentamen ID1004 Objektorienterad programmering May 29, 2012

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

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

INSTRUKTIONSTEXT FO R PLEXTALK Linio Pocket - Mottagare fo r poddradio -

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

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

1 Comparator & Comparable

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Lösningsförslag till tentamen

Hantera remissvar i Public 360

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

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

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tentamen Nätverksprogrammering Lösningsförslag

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

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

TENTAMEN OOP

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

Objektorienterad Programkonstruktion. Föreläsning dec 2015

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

Tentamen. Lösningsförslag

Malmö högskola 2008/2009 CTS

Tentamen EDA698 Realtidssystem (Helsingborg)

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

INSTRUKTIONSTEXT FO R PLEXTALK Linio Pocket - Na tverksmapp -

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

Trygghetsplan för Ekeby förskola

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

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Tentamen Nätverksprogrammering Lösningsförslag

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

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

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

Objektorienterad Programmering (TDDC77)

Föreläsning 3-4 Innehåll

Stockholm Till de organisationer som undertecknat beslutet om samverkan

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

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

Föreningens bästa vän

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Typkonvertering. Java versus C

Integritetspolicy. Org nr: Ventus Norden Växel: Integritetspolicy Sverige

Föreläsning 13 Innehåll

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

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Synkronisering. Ordning och reda

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

Föreläsning 3. Stack

Transkript:

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

Aktiva objekt Det a r va lka nt fra n vardagslivet att saker ha nder samtidigt. Aktiva objekt go r saker pa eget initiativ, medan passiva objekt endast go r saker na r de blir ombedda. Det a r viktigt att det underliggande systemet sto der parallellism sa att man kan modellera verkligheten pa ett bra sa tt. Det a r onaturligt att modellera parallellism som ett sekventiellt fo rlopp. I datorer med en processor simuleras parallellismen.

Motivering Ma nga program ma ste kunna ha lla pa med flera saker samtidigt: bokningssystem av olika slag en webbserver som ma ste kunna leverera flera webbsidor samtidigt en grafisk applikation som ritar samtidigt som den arbetar med na sta bild ett grafiskt anva ndargra nssnitt som utfo r bera kningar och samtidigt a r redo att ha dialog med anva ndaren Denna typ av program kallas samverkande program (concurrent programs). Vi skall ha r endast ge en introduktion till programmering med samverkande program, fo r mer djupga ende studier ha nvisas till kursen Parallellprogrammering.

Trådar I Java beskriver man aktiva objekt (och parallellism) med hja lp av standardklassen Thread. Aktiviteter som pa ga r samtidigt kallas da rfo r i Java fo r tra dar.

Klassen Thread

Trådar I ett parallellt program beskrivs varje aktivitet som en instans av klassen Thread. Det tra den skall utfo ra definieras genom att o verskugga metoden run(). public class SupporterThread extends Thread { private String team; public SupporterThread(String team) { this.team = team; public void run() { for (int i = 0; i < 10; i++) { System.out.print(team + " ");

Trådar Fo r att starta exekveringen av en tra d anropar man metoden start()! Anropas run() direkt skapas ingen tra d. public class WorldCup { public static void main(string[] args) { Thread kallafan = new SupporterThread("Kalla"); Thread wengfan = new SupporterThread("Weng"); kallafan.start(); wengfan.start(); Utskriften kan t.ex. bli: Kalla Weng Kalla Weng Weng Kalla Kalla Weng Kalla Weng Kalla Weng Kalla Weng Weng Kalla Weng Kalla Weng Kalla Kalla Weng

Icke-deterministiskt beteende Sekventiella program sa ges vara deterministiska vilket betyder att: Vilka operationer som utfo rs i programmet a r en konsekvens av fo rega ende operationer Det a r fo rutsa gbart i vilken ordning operationerna i ett sekventiellt program kommer att utfo ras Om ett program ko rs flera ga nger med samma indata kommer samma resultat att erha llas varje ga ng Program med parallellism uppvisar ett icke-deterministiskt beteende: I vilken ordning operationerna sker mellan de olika programflo dena vet vi inte Tva programko rningar med samma indata kan ge olika resultat

Att programmera med trådar Mycket komplicerad, bara använd det när det behövs Svårt att felsöka/avlusa Inte garanterad snabbara än ett sekventiell program (växla mellan trådar kostar tid) Vi introducera bara bas kunskap, en fortsättningskurs behövs

Metoden sleep() En tra d kan tempora rt avbryta sin exekvering med metoden sleep(), som a r en klassmetod i klassen Thread. Metoden sleep() finns i fo ljande tva versioner: public static sleep(long mills) throws InterruptedException public static sleep(long mills, int nanos) throws InterruptedException Tiden som man vill avbryta tra dens exekvering anges alltsa i millisekunder respektive millisekunder och nanosekunder. Eftersom sleep() kan kasta en kontrollerad exceptionell ha ndelse ma ste anropet av metoden ligga i ett try-catch-block.

Exempel På nästa slide har vi skrivit om fo rega ende exempel pa sa sa tt att vi la ter tra den sova med ett slumpma ssigt tidsintervall mellan 0 och 1 sekund mellan varje utskrift. Vi nyttjar ocksa att klassen Thread har en konstruktor public Thread(String name) som ger tra den namnet name, samt att detta namn kan avla sas med metoden getname().

Exempel public class SupporterThread extends Thread { public SupporterThread(String team) { super(team); public void run() { for (int i = 1; i <= 10; i++) { System.out.println(i + " " + getname()); try { Thread.sleep((int)(Math.random() * 1000)); catch (InterruptedException e) {

Exempel Vi skriver ett testprogram som inneha ller tre objekt av typen SupporterThread: public class WorldCup { public static void main(string[] args) { Thread kallafan = new SupporterThread("Kalla"); Thread wengfan = new SupporterThread("Weng"); Thread holigan = new SupporterThread("Ut med domare!"); En ko rning kan se ut enligt nedan: 1 Weng 1 Kalla 1 Ut med domare! 2 Kalla 2 Weng 3 Weng 4 Weng 2 Ut med domare! 3 Ut med domare! kallafan.start(); wengfan.start(); holigan.start();

Interfacet Runnable Java tilla ter inte multipla implementationsarv, da rfo r a r det omo jligt fo r en klass som a r subklass till Thread att a rva fra n na gon annan klass. Aktiva objekt har ma nga ga nger behov av att a rva fra n andra klasser. Lo sningen a r att anva nda interfacet Runnable: public interface Runnable { void run(); Interfacet Runnable har endast en metod run() varje klass som implementerar Runnable ma ste implementera metoden run() metoden run() i klassen som implementerar Runnable a r utga ngspunkten fo r exekveringen av en tra d.

Interfacet Runnable Ett Runnable-objekt abstraherar begreppet ett jobb (t.ex. ett recept). Ett Thread-objekt abstraherar begreppet en arbetare (t.ex. en kock). Hur kan vi associera ett jobb med en arbetare? Genom att klassen Thread har en konstruktor public Thread(Runnable target) Konstruktorn skapar ett Thread-objekt som na r det startas exekverar metoden run() i objekt target. Exempel: Runnable recipe =...; Thread chef = new Thread(recipe); chef.start();

Exempel Runnable Vi skriver en klass Writer som har tva instansvariabler text och interval. Na r ett objekt av klassen Writer exekveras skall texten text skrivas ut ga ng pa ga ng med ett tidsintervall av interval sekunder mellan utskrifterna.

Exempel Runnable public class Writer implements Runnable { private String text; private long interval; public Writer(String text, long time) { this.text = text; interval = time * 1000; public void run() { while (!Thread.interrupted()) { try { Thread.sleep(interval); catch (InterruptedException e) { break; System.out.print(text + " ");

Exempel Runnable Fo r att demonstrera hur flera objekt av klassen Writer kan exekvera parallellt ges nedan ett program som under en minut skriver ut Kalla" var 3:e sekund, Weng" var 4:e sekund och "Ut med domaren!" var 5:e sekund.

Exempel Runnable public class TestWriter { public static void main(string[] arg) { Thread kallafan = new Thread(new Writer("Kalla", 3)); Thread wengfan = new Thread(new Writer("Weng", 4)); Thread huligan = new Thread(new Writer("Ut med domaren!", 5)); kallafan.start(); wengfan.start(); huligan.start(); try { Thread.sleep(60000); kallafan.interrupt(); wengfan.interrupt(); huligan.interrupt(); catch (InterruptedException e) { Avbryt tra darna efter 60 sekunder

Exempel Runnable public class TestWriter2 { public static void main(string[] arg) { Thread kallafan = new Thread(new Writer("Kalla", 3)); Thread wengfan = new Thread(new Writer("Weng", 4)); Thread holigan = new Thread(new Writer("Ut med domaren!", 5)); kallafan.setdaemon(true); wengfan.setdaemon(true); holigan.setdaemon(true); kallafan.start(); wengfan.start(); holigan.start(); try { Thread.sleep(60000); catch (InterruptedException e) { Saẗt till demon-tra dar. Do das av JVM na r det inte finns andra icke demontra dar som exekverar.

Vänta på att tråden skall avsluta Vi uto kar va r tidigare klass WorldCup enligt: public class WorldCup { public static void main(string[] args) { Thread kallafan = new SupporterThread("Kalla"); Thread wengfan = new SupporterThread("Weng"); Thread holigan = new SupporterThread("Ut med domare!"); kallafan.start(); wengfan.start(); holigan.start(); System.out.println("Storma plan!"); Na r stormas planen?

Vänta på att tråden skall avsluta Fo r att va nta pa att en tra d avslutas anva nds metoden join(): public class WorldCup { public static void main(string[] args) { Thread kallafan = new SupporterThread("Kalla"); Thread wengfan = new SupporterThread("Weng"); kallafan.start(); wengfan.start(); try { kallafan.join(); wengfan.join(); catch (InterruptedException e) { System.out.println("Storma plan!");

Trådsäkerhet Da ett objekt modifieras kan det inta ett antal tillfa lliga tillsta nd som inte a r konsistenta (d.v.s. ogiltiga). Om en tra d avbryts under en modifikation av ett objekt, sa kan det la mna objektet i ett ogiltigt tillsta nd. En klass sa ges vara tra dsa ker om den garanterar konsistens fo r sina objekt, a ven om det finns multipla tra dar na rvarande. tråd 1 tråd 2 avariable = 123; avariable avariable = 45;?????

Kritiska sektioner Kodsegment som har access till samma objekt fra n olika separata tra dar utgo r en s.k. kritisk sektion (eng: critical section), och ma ste synkroniseras pa sa sa tt att endast en tra d i taget fa r tillga ng till objektet, annars kan objektet hamna i ett inkonsistent tillsta nd.

Kritiska sektioner exempel Antag att vi har en klass fo r att handha bankkonton enligt nedan: public class Account { private double balance; //... public boolean withdraw(double amount) { if (amount <= balance) { double newbalance = balance - amount; balance = newbalance; return true; else return false; public void deposite(double amount) { balance = balance + amount; //...

Inkonsistent tillstånd Antag vidare att balansen pa ett konto a r 100000 kronor och att tva uttag go rs samtidigt vardera pa 100000 kronor. Fo ljande kan ha nda: Ett inkonsistent tillsta nd pa kontot har intra ffat! Balansen borde vara -100000 men a r 0! Vi har fa tt race condition. En tra d fo rso ker la sa data medan en annan tra d uppdaterar densamma.

Synkronisering Fo r att kontot inte skall hamna i ett inkonsistent tillsta nd ma ste metoden withdraw synkroniseras, dvs endast en tra d i taget skall kunna fa tillga ng till metoden. Java's lo sning fo r att a stadkomma synkronisering: varje objekt definieras som en monitor, vilken har ett singula rtla s fo r att en tra d skall fa tilltra detill en kritisk sektion ma ste tra den fo rstfa tillga ng till la set att ha tillga ng till la set inneba r att ingen annan tra d kan ha tillga ng till la set la set a terla mnas na r tra den la mnar den kritiska sektionen. Allt detta go rs automatiskt med konstruktionen synchronized. Programmerarens uppgift a r att identifiera de kritiska sektionerna.

Synkroniserad version av withdraw public class Account { private double balance; //... public synchronized boolean withdraw(double amount) { if (amount <= balance) { double newbalance = balance - amount; balance = newbalance; return true; else return false; public void deposite(double amount) { balance = balance + amount; //...

Konsistent tillstånd Om vi nu a terigen antar att balansen pa kontot a r 100000 kronor och att tva uttag go rs samtidigt pa 100000 kronor ha nder fo ljande: Balans Uttag 1 Uttag 2 100000 amount<= balance 100000 newbalance = balance - amount 0 balance = newbalance 0 return true 0 amount<= balance 0 return false

Ömsesidg uteslutning Fo r att go ra klassen Account tra dsa ker ra cker det inte att enbart metoden withdraw a r synkroniserad, utan a ven metoden deposite ma ste synkroniseras. Detta pa grund av att ba da metoderna konkurrerar om att fo ra ndra tillsta ndet pa variabeln balance.

Ömsesidg uteslutning public class Account { private double balance; //... public synchronized boolean withdraw(double amount) { if (amount <= balance) { double newbalance = balance - amount; balance = newbalance; return true; else return false; public synchronized void deposite(double amount) { balance = balance + amount; ac.withdraw sta nger ute ytterligare en ac.withdraw ac.withdraw sta nger ute ac.deposit //... ac.deposit sta nger ute ytterligare en ac.deposit ac.deposit sta nger ute ac.withdraw men ac1.withdraw sta nger inte ute ac2.withdraw, etc.

Låset ägs av tråden La set a gs av tra den, vilket fo rhindrar att en tra d blir blockerad av ett la s som tra den redan har: public class ChainExample { public synchronized void methoda() { //do something methodb(); //do something more public synchronized void methodb() { //do something I och med att tra den a r i besittning av la set na r metoden methoda bo rjar exekvera och la set sla pps fo rst na r exekveringen av metoden a r klar a r tra den i besittning av la set na r den synkroniserade metoden methodb anropas.

Synkronisering av satser Om alla metoder a r synkroniserade i ett objekt kan endast en tra d a t ga ngen anva nda objektet. Fo r lite synkronisering konflikter mellan tra dar inkonsistens pa grund av tillga ng till samma resurs (race condition) Fo r mycket synkronisering tra darna fa r va nta pa varandra, ingen parallellism

Synkronisering av satser Det a r mo jligt att synkronisera enskilda satser med konstruktionen: synchronized (obj) { <statements> da r obj a r en godtycklig objektreferens. Fo r att att kunna exekvera satserna i <statements> ma stetra den a ga la set till objektet obj. public static void amethod(int[] n) { //... synchronized(n) { for (int = 0; i < n.length; i = i + 1) { if(n[i] > 100) { save(n[i]); //...

Synkronisering av satser Om satser som bero r en primitiv variabel skall synkroniseras, associeras den primitiva variabeln med ett la s-objekt. public class PrimaryTypeSynchronization { private int valuea; private double valueb; private Object locka = new Object(); private Object lockb = new Object(); public void seta(int value) { synchronized(locka) { valuea = value; public double geta() { synchronized(locka) { return valuea; public void setb(double value) { synchronized(lockb) { valueb = value; public double getb() { synchronized(lockb) { return valueb;

Samarbete mellan trådar Synkronisering handlar om uteslutning inte samarbete. Samarbete inneba r: va nta: na r en tra d inte kan fortsa tta, sa la t andra tra dar fortsa tta meddela: va ck upp sovande tra dar om det ha nder na got som dessa kanske va ntar pa Metoden wait() suspenderar tra den och o ppnar la set fo r objektet andra tra dar fa r mo jlighet att exekvera synkroniserade metoder tra den va cks na r na gon tra d anropar notifyall fo r objektet Metoden notifyall() signalerar till andra tra dar som va ntar pa att objektet skall vakna Anm: Det finns a ven en metod notify(), men den bo r inte anva ndas.

Live coding Producent-konsument exempel: Creator och Terminator

What s next Block 7-2: Sammanfattning