Canvas
Threads
Starten
Eindigen
Onderbreken
Programmeren in Java 3 W. Oele
7 maart 2010
W. Oele Programmeren in Java 3
Sleep
Join
Canvas
Threads
Starten
Eindigen
Deze les
Zelf componenten maken Concurrency (multithreading): werken met threads levenscyclus van een thread starten tijdelijk onderbreken wachten stoppen
W. Oele Programmeren in Java 3
Onderbreken
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Zelf componenten maken
Je eigen component: moet te behandelen zijn zoals andere componenten uit de Java A.P.I. derhalve afleiden van de JComponent klasse? betere optie: afleiden van java.awt.Canvas
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
java.awt.Canvas
Uit de A.P.I: A Canvas component represents a blank rectangular area of the screen onto which the application can draw or from which the application can trap input events from the user. An application must subclass the Canvas class in order to get useful functionality such as creating a custom component. The paint method must be overridden in order to perform custom graphics on the canvas.
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
java.awt.Canvas gebruiken
Recept: Eigen klasse maken Afleiden van Canvas Paint methode herdefini¨eren methodes uit de Graphics klasse gebruiken methodes uit de Color klasse gebruiken
Gebruiken zoals andere componenten
W. Oele Programmeren in Java 3
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Voorbeeld
public class MijnComponent extends Canvas { public void Paint(Graphics g) { g.setColor(new Color(255,0,0)); g.drawRectangle(1,1,10,10); } }
W. Oele Programmeren in Java 3
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Threads
Tot nu toe: Programma’ s bestonden uit een opeenvolging van statements: berekeningen uitvoeren objecten aanmaken/vernietigen enz.
Nog steeds bestaat een programma uit een opeenvolging (draad) van instructies. . .
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Grafisch
Statement 1
Statement 2
Statement 3
Statement 4
W. Oele Programmeren in Java 3
Onderbreken
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Multithreading
Programma’ s kunnen meerdere draden van executie hebben: iedere thread loopt op zichzelf het gedrag van threads is onvoorspelbaar processor verdeelt de rekenkracht over de verschillende rekenkracht echt parallelisme in een singlecore? multicores?
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
De thread
Een thread: is een object: instantie van java.lang.Thread of is afgeleid van Thread of implementeert de interface java.lang.Runnable heeft een public void run() methode Bij het implementeren van de Runnable interface is het implementeren van de run() methode uiteraard verplicht.
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Voorbeeld public class EenThread extends Thread { public void run() { .......... statements die in de thread moeten worden uitgevoerd .......... } } W. Oele Programmeren in Java 3
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Voorbeeld public class EenThread implements Runnable { public void run() { .......... statements die in de thread moeten worden uitgevoerd .......... } } W. Oele Programmeren in Java 3
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Toestanden
Een thread kan zich in verschillende toestanden bevinden: thread is aangemaakt, maar nog niet gestart (levenloos?) thread is gestart: (in leven?) thread draait thread is tijdelijk onderbroken thread wacht: op het aflopen van een andere thread op een signaal om verder te gaan
afgelopen, definitief be¨eindigd (dood?)
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Model
levenloos
W. Oele Programmeren in Java 3
in leven
dood
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een thread starten
Een thread wordt gestart met de start() methode: Een thread kan slechts ´e´en keer worden gestart. Pogingen een thread nogmaals te starten middels een aanroep van start() worden door de compiler geweigerd. Het opnieuw starten van een thread kun je alleen voor elkaar krijgen door een nieuw threadobject aan te maken. . .
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Join
Voorbeeld
........ EenThread x = new EenThread(); x.start(); ........ EenThread y = new EenThread(); y.start(); ........ andere statements ........ x.start();
W. Oele Programmeren in Java 3
//threadobject aangemaakt //thread gestart //thread 2 aangemaakt //thread 2 gestart
//fout
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een levende thread
Aanroepen van de start() methode leidt tot het ´e´enmalig uitvoeren van de run() methode. Zolang run() wordt uitgevoerd, leeft de thread. Vaak wordt in de run() methode een loop geplaatst.
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Voorbeeld
public class EenThread extends Thread { public void run() { for(int i=0;i<20;i++) { voer_van_alles_uit(); } } }
W. Oele Programmeren in Java 3
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Model
levenloos
in leven start();
W. Oele Programmeren in Java 3
run()
dood einde run()
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een thread definitief be¨eindigen
Een thread is definitief be¨eindigd wanneer de run() methode eindigt. Nogmaals: Na het eindigen van de run() methode is het opnieuw starten van de thread niet meer mogelijk. Elk middel dat (een oneindige loop in) de run() methode stopt, kan worden ingezet voor het eindigen van de thread.
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Voorbeeld public class EenThread extends Thread { public void run() { while(true) { voer_van_alles_uit(); if(conditie) { break; } } } } W. Oele Programmeren in Java 3
Onderbreken
Sleep
Join
Canvas
Threads
Starten
Eindigen
Voorbeeld public class EenThread extends Thread { public void run() { while(true) { voer_van_alles_uit(); if(conditie) { return; } } } } W. Oele Programmeren in Java 3
Onderbreken
Sleep
Join
Canvas
Threads
Starten
Eindigen
Veel voorkomend voorbeeld public class EenThread extends Thread { private boolean isrunning; public EenThread(){isrunning=true); public void run() { while(isrunning) { voer_van_alles_uit(); if(conditie) { isrunning=false; } } } } W. Oele Programmeren in Java 3
Onderbreken
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Threads onderbreken
Het kan gebeuren dat een thread onderbroken moet worden. Onderbreken betekent: stop waar je mee bezig bent en doe nu (even?) iets anders. Onderbroken of niet: de thread blijft in leven. Gevaarlijk: Moet een thread meteen ophouden, ook als deze een variabele leest of schrijft?
Threads worden op een “beschaafde” manier onderbroken middels het gebruik van een exception: de InterruptedException
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Voorbeeld public void run() { while(isrunning) { try { voer_van_alles_uit(); } catch (InterruptedException e) { doe_iets_anders(); } } } W. Oele Programmeren in Java 3
Sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een thread onderbreken
Een thread kan zichzelf onderbreken door: een InterruptedException op te werpen de interrupt() methode aan te roepen
Een andere thread kan eveneens een thread onderbreken middels het aanroepen van interrupt()
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Model
levenloos
in leven start();
run() interrupt
catch
W. Oele Programmeren in Java 3
dood einde run()
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een thread tijdelijk uitschakelen (slapen)
Tijdelijk uitschakelen van een thread bereikt men met de sleep(long millis) methode. Aanroepen van sleep zorgt ervoor dat de thread even gaat “slapen”. Het aantal milliseconden dat wordt opgegeven is niet gegarandeerd dat aantal milliseconden. Voor de precisie ben je afhankelijk van het o.s.
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een thread tijdelijk uitschakelen (slapen)
Een thread: is bezig met zijn standaard taken slaapt Hoe onderbreek je het slapen van een thread als dat slapen lang duurt of er iets belangrijks aan de hand is?
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een thread tijdelijk uitschakelen (slapen)
Hoe onderbreek je het slapen van een thread als dat slapen lang duurt of er iets belangrijks aan de hand is? Ook de sleep methode kan een InterruptedException opwerpen. sleep moet derhalve in een try catch constructie worden gehangen. Een andere thread kan de methode interrupt() gebruiken om het slapen te onderbreken.
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een thread be¨eindigen n.a.v. een InterruptedException
Vraag: hoe be¨eindig je een thread naar aanleiding van een InterruptedException?
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Een thread be¨eindigen n.a.v. een InterruptedException Simpel: catch (InterruptedException e) { return; } of: catch (InterruptedException e) { break; }
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Model
levenloos
in leven start();
run() interrupt
catch
W. Oele Programmeren in Java 3
dood einde run()
sleep
Join
Canvas
Threads
Starten
Eindigen
Onderbreken
Sleep
Threads op elkaar laten wachten
Een thread kan de opdracht krijgen zichzelf te onderbreken, totdat een andere thread is be¨eindigd. De methode public void join() kan hiervoor worden gebruikt.
W. Oele Programmeren in Java 3
Join
Canvas
Threads
Starten
Eindigen
Join thread A
join
W. Oele Programmeren in Java 3
thread B
Onderbreken
Sleep
Join