7 maart 2010
Deze les Zelf componenten maken Concurrency (multithreading): werken met threads levenscyclus van een thread starten tijdelijk onderbreken wachten stoppen
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
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.
java.awt.canvas gebruiken Recept: Eigen klasse maken Afleiden van Canvas Paint methode herdefiniëren methodes uit de Graphics klasse gebruiken methodes uit de Color klasse gebruiken Gebruiken zoals andere componenten
Voorbeeld public class MijnComponent extends Canvas public void Paint(Graphics g) g.setcolor(new Color(255,0,0)); g.drawrectangle(1,1,10,10);
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...
Grafisch Statement 1 Statement 2 Statement 3 Statement 4
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?
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.
Voorbeeld public class EenThread extends Thread public void run()... statements die in de thread moeten worden uitgevoerd...
Voorbeeld public class EenThread implements Runnable public void run()... statements die in de thread moeten worden uitgevoerd...
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ëindigd (dood?)
Model levenloos in leven dood
Een thread starten Een thread wordt gestart met de start() methode: Een thread kan slechts één 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...
Voorbeeld... EenThread x = new EenThread(); x.start();... EenThread y = new EenThread(); y.start();... andere statements... x.start(); //threadobject aangemaakt //thread gestart //thread 2 aangemaakt //thread 2 gestart //fout
Een levende thread Aanroepen van de start() methode leidt tot het éénmalig uitvoeren van de run() methode. Zolang run() wordt uitgevoerd, leeft de thread. Vaak wordt in de run() methode een loop geplaatst.
Voorbeeld public class EenThread extends Thread public void run() for(int i=0;i<20;i++) voer_van_alles_uit();
Model levenloos in leven dood start(); run() einde run()
Een thread definitief beëindigen Een thread is definitief beëindigd 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.
Voorbeeld public class EenThread extends Thread public void run() while(true) voer_van_alles_uit(); if(conditie) break;
Voorbeeld public class EenThread extends Thread public void run() while(true) voer_van_alles_uit(); if(conditie) return;
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;
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
Voorbeeld public void run() while(isrunning) try voer_van_alles_uit(); catch (InterruptedException e) doe_iets_anders();
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()
Model levenloos in leven dood start(); run() interrupt einde run() catch
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.
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?
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.
Een thread beëindigen n.a.v. een InterruptedException Vraag: hoe beëindig je een thread naar aanleiding van een InterruptedException?
Een thread beëindigen n.a.v. een InterruptedException Simpel: catch (InterruptedException e) return; of: catch (InterruptedException e) break;
Model levenloos in leven dood start(); run() interrupt sleep einde run() catch
Threads op elkaar laten wachten Een thread kan de opdracht krijgen zichzelf te onderbreken, totdat een andere thread is beëindigd. De methode public void join() kan hiervoor worden gebruikt.
Join thread A thread B join