SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
Olivier Curé ­ UMLV [page 1 ]
Programmation
concurrente
Olivier Curé ­ UMLV [page 2 ]
Introduction
● La programmation concurrente correspond à
l'ensemble des mécanismes permettant
l'exécution concurrente d'actions spécifiées
de manière séquentielle.
● En fait, de nombreuses applications
fonctionnent simultanément sur vos
machines (multitâche).
Olivier Curé ­ UMLV [page 3 ]
Introduction
● Chaque application est associée à un
processus.
● Si la machine ne dispose que d'un
processeur, l'OS donne l'impression que les
applications fonctionnent en même temps en
répartissant le temps processeur entre les
applications.
Olivier Curé ­ UMLV [page 4 ]
En Java
● On fait la différence entre 2
mécanismes supportant
l'ordonnancement automatique des
traitements:
– La concurrence entre commmandes du
systèmes
– La concurrence entre processus légers
(thread) de la JVM
Olivier Curé ­ UMLV [page 5 ]
Thread
● Correspond au fil d'exécution, c'est-à-
dire à une suite d'insturctions en cours
d'exécution.
● Un thread est créé et géré par la JVM.
● Il peut y avoir plusieurs threads pour un
programme donné et ils s'exécutent
dans un espace mémoire commun
(piles différentes mais tas commun).
Olivier Curé ­ UMLV [page 6 ]
Threading en Java
● La méthode main() est exécutée par un
thread.
● Les applications disposant d'une GUI
vont implicitement créées un autre
thread, par exemple AWT event thread.
Olivier Curé ­ UMLV [page 7 ]
Threading en Java
public class MonThread{
public static void main(String[] args) throws Exception{
Thread thread1 = Thread.currentThread();
thread1.setName("Thread du main");
System.out.println(thread1);
System.out.println(thread1.isAlive());
Thread thread2 = new Thread();
thread2.setName("thread #2");
System.out.println(thread2);
System.out.println(thread2.isAlive());
thread2.start();
System.out.println(thread2.isAlive());
}
}
Exécution:
Thread[Thread du main,5,main]
true
Thread[thread #2,5,main]
false
true
1 processus léger appartient
à un groupe (ex: main) et a
une priorité (ex: 5).
Olivier Curé ­ UMLV [page 8 ]
Création de threads
● Une instance la classe java.lang.Thread
● On peut créer une sous classe de Thread ou bien
créer une classe implémentant l'interface
java.lang.Runnable.
● On favorise souvent l'approche avec Runnable.
● Cette interface dispose d'une seule méthode:
run(), comme main() c'est le point d'entrée du
code.
● Si le thread sort de run() alors il est considéré
comme mort et ne peut redémarrer.
Olivier Curé ­ UMLV [page 9 ]
Démarrage d'un processus
léger
● Démarrage d'un processus léger avec la
méthode start() du thread. La JVM réserve et
affecte l'espace mémoire avant d'appeler la
méthode run() qui exécute le processus léger
de la cible.
● Un objet Thread implante l'interface Runnable.
● La méthode run() peut donc être invoquée :
– En implantant la méthode
– En redéfinissant la méthode de la classe
Thread.
Olivier Curé ­ UMLV [page 10 ]
Exemple
Solution 1:rédéfinition de la méthode run() de la classe Thread
class MyThread extends Thread {
@Override public void run() {// code à exécuter }
}
...
Thread t=new MyThread(); // création
t.start(); // démarrage
}
Solution 2 (implantation de l'interface Runnable:
class MyRunnable implements Runnable {
public void run() {// code à exécuter }
}
...
MyRunnable r=new MyRunnable();
Thread t=new Thread(r); // création
t.start(); // démarrage
Olivier Curé ­ UMLV [page 11 ]
Création de threads
● Normallement la méthode run() n'est pas
invoqué explicitement (comme main()).
● On passe une instance d'une classe Runnable à
un thread.
● Exemple:
Thread t = new Thread(new myRunnable);
● Exemple avec une inner class:
Thread t = new Thread (new Runnable() {
public void run() {..} });
Olivier Curé ­ UMLV [page 12 ]
java.lang.Thread
● Pour chaque instance de la classe Thread nous
disposons des méthodes:
– get/setName()
– get/setPriority() : une valeur entière
entre 1 et 10. Plus la valeur est élevée,
plus le thread est prioritaire. 3
constantes: MIN/NORM,MAX_PRIORITY,
resp. 1, 5 et 10.
– getThreadGroup() pour connaître le
groupe du thread (classe ThreadGroup).
Olivier Curé ­ UMLV [page 13 ]
java.lang.Thread
– getState() (depuis Java 1.5) pour
connaître l'état d'un processus léger.
Expression à l'aide de type énuméré de
type Thread.State:
● NEW (pas encore démarré)
● RUNNABLE (en cours d'exécution ou attend une
ressource)
● BLOCKED (bloqué en attente d'un
moniteur(lock)
● WAITING (attente indéfinie d'une ressource d'un
autre thread
● TIMED_WAITING (attente bornée)
● TERMINATED
Olivier Curé ­ UMLV [page 14 ]
java.lang.Thread : sleep
● La méthode (static) sleep(int) d'un thread
force temporairement l'arrêt de son
exécution.
● Exemple, arrêt pendant 1 seconde:
Thread.sleep(1000);
Olivier Curé ­ UMLV [page 15 ]
Sleep exemple
public class SleepExample implements Runnable
{
public void run() {
long t = System.currentTimeMillis(), x;
try {
Thread.sleep(300); // on attend 300ms
} catch(InterruptedException e) {}
x = System.currentTimeMillis();
System.out.println("Attente = "+ (x-t));
}
public static void main(String args[]) {
Runnable r = new SleepExample();
Thread t = new Thread(r);
t.start();
}
}
Olivier Curé ­ UMLV [page 16 ]
Caractéristiques des
threads
● Lent au démarrage mais une solution de
threads pooling peut être utilisé.
● Augmentation de la complexité du code
● Difficulté du partage des ressources entre
plusieurs threads.
Olivier Curé ­ UMLV [page 17 ]
Gestion des threads
● Pour permettre à plusieurs opérations une
exécution concurrente sur un seul
processeur, il est nécessaire de transférer le
contrôle du processeur d'un thread à un
autre. On parle de context switching.
● 2 approches:
– Coopératif: un thread délaisse
volontairement le processeur
– Préemptif: le contrôle du processeur est
passé d'un thread à un autre de manière
arbitraire.
Olivier Curé ­ UMLV [page 18 ]
Coopératif vs Préemptif
● Aspect préemptif évite la
monopolisation du processeur par un
thread, enlève la charge de la gestion
du contrôle au programmeur mais ce
dernier doit coordonner l'utilisation des
ressources partagées par plusieurs
threads.
● Avec l'approche préemptive, l'ordre
dans d'exécution des threads n'est pas
certain. On parle de race condition.
Olivier Curé ­ UMLV [page 19 ]
Exemple
Retourne en générale:
Valeur =5
Valeur=10
public class ThreadShare implements Runnable {
public int partage=0;
public static void main(String args[]) {
ThreadShare ts = new ThreadShare();
Thread t1 = new Thread (ts);
Thread t2 = new Thread(ts);
t1.start();
t2.start();
}
public void run() {
partage+=5;
System.out.println("Valeur ="+ partage);
}
}
Olivier Curé ­ UMLV [page 20 ]
Exemple 2
● Mais on pourrait aussi avoir:
valeur=10; Valeur=10
● Exemple de séquence:
– t1 entre dans run()
– t1 ajoute 5 à partage (=5)
– Context switch
– t2 entre dans run()
– t2 ajoute 5 à partage (=10)
– t2 affiche partage
– Context switch
– t1 affiche partage
Olivier Curé ­ UMLV [page 21 ]
Synchronization
● Chaque instance de la classe Object
maintient un moniteur (ou lock) et le mot clé
synchronized est toujours associé avec ces
instances.
● Avant qu'un thread utilise une méthode ou
portion de codes synchronisée, il doit obtenir
le moniteur de cet objet.
● Si le moniteur a été donné à un autre thread
alors il doit attendre une libération du thread
(situation de blocage).
Olivier Curé ­ UMLV [page 22 ]
Synchronization 2
● En plus du moniteur, chaque objet dispose
d'une liste de threads bloqués en attente du
moniteur.
● Lorsque le moniteur devient disponible, un
des threads de la liste recevra le moniteur et
ainsi poursuivra son exécution.
Olivier Curé ­ UMLV [page 23 ]
Exemple 3
public class ThreadShare implements Runnable {
public int partage=0;
public static void main(String args[]) {
ThreadShare ts = new ThreadShare();
Thread t1 = new Thread (ts);
Thread t2 = new Thread(ts);
t1.start();
t2.start();
}
public void run() {
opePartage();
}
public synchronized void opePartage() {
partage +=5;
System.out.println("Valeur ="+ partage);
}
}
Olivier Curé ­ UMLV [page 24 ]
Exemple 4
public class ThreadShare2 implements Runnable {
public Integer partage=0;
public static void main(String args[]) {
ThreadShare2 ts = new ThreadShare2();
Thread t1 = new Thread (ts);
Thread t2 = new Thread(ts);
t1.start();
t2.start();
}
public void run() {
synchronized(partage) {
partage+=5;
System.out.println("Valeur ="+ partage);
}
}
}
Olivier Curé ­ UMLV [page 25 ]
Synchronisation 3
● Il faut synchroniser un minimum de ligne de
codes.
● Synchronisation de méthode ou bien de bloc
de codes.
● Deadlock : un thread t1 attend que le thread
t2 libère le moniteur d'un objet mais t2
attend le moniteur bloqué par t1.
– Solutions: synchronisation de haut
niveau ou ordonnancement des
blocages.
Olivier Curé ­ UMLV [page 26 ]
Synchronisation entre
processus légers
● 2 solutions proposées dans l'environnement
Java:
– wait()/notify()
– join()
Olivier Curé ­ UMLV [page 27 ]
Synchronisation entre
processus légers
● wait() et notify() des méthodes la classe
Object
– wait() pour attendre l'arrivée d'un
événement particulier. Le thread doit
avoir le moniteur.
– notify() pour indiquer l'arrivée de cet
événement.
Olivier Curé ­ UMLV [page 28 ]
Producteur/Consommateur
class Q {
int n;
boolean valueSet = false;
synchronized int get() {
if(!valueSet)
try {
wait();
} catch(InterruptedException e) {
System.out.println("InterruptedException
caught");
}
System.out.println("Got: " + n);
valueSet = false;
notify();
return n;
}
synchronized void put(int n) {
if(valueSet)
try {
wait();
} catch(InterruptedException e) {
System.out.println("InterruptedException caught");
}
this.n = n;
valueSet = true;
System.out.println("Put: " + n);
notify();
}
}
class Producer implements Runnable {
Q q;
Producer(Q q) {
this.q = q;
new Thread(this, "Producer").start();
}
public void run() {
int i = 0;
while(true) {
q.put(i++);
}
}
}
class Consumer implements Runnable {
Q q;
Consumer(Q q) {
this.q = q;
new Thread(this, "Consumer").start();
}
public void run() {
while(true) {
q.get();
}
}
}
public class ProdCons {
public static void main(String args[]) {
Q q = new Q();
new Producer(q);
new Consumer(q);
}
}
Olivier Curé ­ UMLV [page 29 ]
Synchronisation entre
processus légers
● join() est une méthode de la classe Thread
● Elle permet d'attendre d'une terminaison
● join() appelé sur l'objet contrôlant un
processus léger dont la terminaison est
attendue. Le processus courant est
interrompu jusqu'à la fin du processus.
Olivier Curé ­ UMLV [page 30 ]
Join, exemple
class Slave implements Runnable {
private int value = 0;
public int getValue() {
return value;
}
public void run() {
for(;value <5;value++) {
try {
Thread.sleep(200);
}
catch(InterruptedException e) {
System.out.println(e.getMessage());
}
}
}
}
class Master implements Runnable {
public void run() {
Slave slave = new Slave();
Thread slaveThread = new Thread(slave);
slaveThread.start();
try {
slaveThread.join();
}
catch(InterruptedException e) {
System.out.println(e.getMessage());
}
System.out.println(slave.getValue());
}
}
public class SlaveMaster {
public static void main(String[] args)
{
Master master = new Master();
Thread masterThread = new
Thread(master);
masterThread.start();
}
}
Affiche 0 sans le bloc
Affiche 5 avec le bloc.

Contenu connexe

Similaire à synchronization.pdf

Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrenteFranck SIMON
 
Mécanisme de planification de tâches
Mécanisme de planification de tâchesMécanisme de planification de tâches
Mécanisme de planification de tâchesNovencia Groupe
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_threadSaber LAJILI
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...ENSET, Université Hassan II Casablanca
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Microsoft
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Ippon
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Jean-Michel Doudoux
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdfPatiento Del Mar
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application javaAntoine Rey
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdfLarbaSAWADOGO2
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdfLarbaSAWADOGO2
 
Scripting Linux avec Python partie1.pptx
Scripting Linux avec Python partie1.pptxScripting Linux avec Python partie1.pptx
Scripting Linux avec Python partie1.pptxFrancisRUKAN
 
Concepts de base O.O (1)
Concepts de base O.O (1)Concepts de base O.O (1)
Concepts de base O.O (1)Ouijden Dhemaid
 
Fmin103 0910 tpjdbc
Fmin103 0910 tpjdbcFmin103 0910 tpjdbc
Fmin103 0910 tpjdbcKarim Amane
 

Similaire à synchronization.pdf (20)

Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
 
Mécanisme de planification de tâches
Mécanisme de planification de tâchesMécanisme de planification de tâches
Mécanisme de planification de tâches
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
 
les Threads
les  Threadsles  Threads
les Threads
 
Cours java
Cours javaCours java
Cours java
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
Bbl sur les tests
Bbl sur les testsBbl sur les tests
Bbl sur les tests
 
Cours spring
Cours springCours spring
Cours spring
 
Jenkins
JenkinsJenkins
Jenkins
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Chapitre 4 Linux
Chapitre 4 LinuxChapitre 4 Linux
Chapitre 4 Linux
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdf
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdf
 
Scripting Linux avec Python partie1.pptx
Scripting Linux avec Python partie1.pptxScripting Linux avec Python partie1.pptx
Scripting Linux avec Python partie1.pptx
 
Concepts de base O.O (1)
Concepts de base O.O (1)Concepts de base O.O (1)
Concepts de base O.O (1)
 
Fmin103 0910 tpjdbc
Fmin103 0910 tpjdbcFmin103 0910 tpjdbc
Fmin103 0910 tpjdbc
 

Plus de Patiento Del Mar

hibernateormoverview-140501154227-phpapp02.pdf
hibernateormoverview-140501154227-phpapp02.pdfhibernateormoverview-140501154227-phpapp02.pdf
hibernateormoverview-140501154227-phpapp02.pdfPatiento Del Mar
 
hibernateormfeatures-140223193044-phpapp02.pdf
hibernateormfeatures-140223193044-phpapp02.pdfhibernateormfeatures-140223193044-phpapp02.pdf
hibernateormfeatures-140223193044-phpapp02.pdfPatiento Del Mar
 
Spring Data Advanced Querying.ppt
Spring Data Advanced Querying.pptSpring Data Advanced Querying.ppt
Spring Data Advanced Querying.pptPatiento Del Mar
 
Thymeleaf and Spring Controllers.ppt
Thymeleaf and Spring Controllers.pptThymeleaf and Spring Controllers.ppt
Thymeleaf and Spring Controllers.pptPatiento Del Mar
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdfPatiento Del Mar
 
12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdfPatiento Del Mar
 
17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdfPatiento Del Mar
 
13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdfPatiento Del Mar
 
15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdfPatiento Del Mar
 
Concurrence-Interruption-Exceptions.pdf
Concurrence-Interruption-Exceptions.pdfConcurrence-Interruption-Exceptions.pdf
Concurrence-Interruption-Exceptions.pdfPatiento Del Mar
 

Plus de Patiento Del Mar (20)

grpc_tutorial.pdf
grpc_tutorial.pdfgrpc_tutorial.pdf
grpc_tutorial.pdf
 
0.coursGitEclipse.pdf
0.coursGitEclipse.pdf0.coursGitEclipse.pdf
0.coursGitEclipse.pdf
 
Primefaces.ppt
Primefaces.pptPrimefaces.ppt
Primefaces.ppt
 
hibernateormoverview-140501154227-phpapp02.pdf
hibernateormoverview-140501154227-phpapp02.pdfhibernateormoverview-140501154227-phpapp02.pdf
hibernateormoverview-140501154227-phpapp02.pdf
 
hibernateormfeatures-140223193044-phpapp02.pdf
hibernateormfeatures-140223193044-phpapp02.pdfhibernateormfeatures-140223193044-phpapp02.pdf
hibernateormfeatures-140223193044-phpapp02.pdf
 
Spring Data Advanced Querying.ppt
Spring Data Advanced Querying.pptSpring Data Advanced Querying.ppt
Spring Data Advanced Querying.ppt
 
Thymeleaf and Spring Controllers.ppt
Thymeleaf and Spring Controllers.pptThymeleaf and Spring Controllers.ppt
Thymeleaf and Spring Controllers.ppt
 
Spring Security.ppt
Spring Security.pptSpring Security.ppt
Spring Security.ppt
 
momjms.pdf
momjms.pdfmomjms.pdf
momjms.pdf
 
rmi.pdf
rmi.pdfrmi.pdf
rmi.pdf
 
cours6.pdf
cours6.pdfcours6.pdf
cours6.pdf
 
22-reflection.pdf
22-reflection.pdf22-reflection.pdf
22-reflection.pdf
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf
 
12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf
 
17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf
 
13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf
 
15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf
 
Concurrence-Interruption-Exceptions.pdf
Concurrence-Interruption-Exceptions.pdfConcurrence-Interruption-Exceptions.pdf
Concurrence-Interruption-Exceptions.pdf
 
Chap7_JavaNet.pdf
Chap7_JavaNet.pdfChap7_JavaNet.pdf
Chap7_JavaNet.pdf
 
module_I6_Sockets.pdf
module_I6_Sockets.pdfmodule_I6_Sockets.pdf
module_I6_Sockets.pdf
 

synchronization.pdf

  • 1. Olivier Curé ­ UMLV [page 1 ] Programmation concurrente
  • 2. Olivier Curé ­ UMLV [page 2 ] Introduction ● La programmation concurrente correspond à l'ensemble des mécanismes permettant l'exécution concurrente d'actions spécifiées de manière séquentielle. ● En fait, de nombreuses applications fonctionnent simultanément sur vos machines (multitâche).
  • 3. Olivier Curé ­ UMLV [page 3 ] Introduction ● Chaque application est associée à un processus. ● Si la machine ne dispose que d'un processeur, l'OS donne l'impression que les applications fonctionnent en même temps en répartissant le temps processeur entre les applications.
  • 4. Olivier Curé ­ UMLV [page 4 ] En Java ● On fait la différence entre 2 mécanismes supportant l'ordonnancement automatique des traitements: – La concurrence entre commmandes du systèmes – La concurrence entre processus légers (thread) de la JVM
  • 5. Olivier Curé ­ UMLV [page 5 ] Thread ● Correspond au fil d'exécution, c'est-à- dire à une suite d'insturctions en cours d'exécution. ● Un thread est créé et géré par la JVM. ● Il peut y avoir plusieurs threads pour un programme donné et ils s'exécutent dans un espace mémoire commun (piles différentes mais tas commun).
  • 6. Olivier Curé ­ UMLV [page 6 ] Threading en Java ● La méthode main() est exécutée par un thread. ● Les applications disposant d'une GUI vont implicitement créées un autre thread, par exemple AWT event thread.
  • 7. Olivier Curé ­ UMLV [page 7 ] Threading en Java public class MonThread{ public static void main(String[] args) throws Exception{ Thread thread1 = Thread.currentThread(); thread1.setName("Thread du main"); System.out.println(thread1); System.out.println(thread1.isAlive()); Thread thread2 = new Thread(); thread2.setName("thread #2"); System.out.println(thread2); System.out.println(thread2.isAlive()); thread2.start(); System.out.println(thread2.isAlive()); } } Exécution: Thread[Thread du main,5,main] true Thread[thread #2,5,main] false true 1 processus léger appartient à un groupe (ex: main) et a une priorité (ex: 5).
  • 8. Olivier Curé ­ UMLV [page 8 ] Création de threads ● Une instance la classe java.lang.Thread ● On peut créer une sous classe de Thread ou bien créer une classe implémentant l'interface java.lang.Runnable. ● On favorise souvent l'approche avec Runnable. ● Cette interface dispose d'une seule méthode: run(), comme main() c'est le point d'entrée du code. ● Si le thread sort de run() alors il est considéré comme mort et ne peut redémarrer.
  • 9. Olivier Curé ­ UMLV [page 9 ] Démarrage d'un processus léger ● Démarrage d'un processus léger avec la méthode start() du thread. La JVM réserve et affecte l'espace mémoire avant d'appeler la méthode run() qui exécute le processus léger de la cible. ● Un objet Thread implante l'interface Runnable. ● La méthode run() peut donc être invoquée : – En implantant la méthode – En redéfinissant la méthode de la classe Thread.
  • 10. Olivier Curé ­ UMLV [page 10 ] Exemple Solution 1:rédéfinition de la méthode run() de la classe Thread class MyThread extends Thread { @Override public void run() {// code à exécuter } } ... Thread t=new MyThread(); // création t.start(); // démarrage } Solution 2 (implantation de l'interface Runnable: class MyRunnable implements Runnable { public void run() {// code à exécuter } } ... MyRunnable r=new MyRunnable(); Thread t=new Thread(r); // création t.start(); // démarrage
  • 11. Olivier Curé ­ UMLV [page 11 ] Création de threads ● Normallement la méthode run() n'est pas invoqué explicitement (comme main()). ● On passe une instance d'une classe Runnable à un thread. ● Exemple: Thread t = new Thread(new myRunnable); ● Exemple avec une inner class: Thread t = new Thread (new Runnable() { public void run() {..} });
  • 12. Olivier Curé ­ UMLV [page 12 ] java.lang.Thread ● Pour chaque instance de la classe Thread nous disposons des méthodes: – get/setName() – get/setPriority() : une valeur entière entre 1 et 10. Plus la valeur est élevée, plus le thread est prioritaire. 3 constantes: MIN/NORM,MAX_PRIORITY, resp. 1, 5 et 10. – getThreadGroup() pour connaître le groupe du thread (classe ThreadGroup).
  • 13. Olivier Curé ­ UMLV [page 13 ] java.lang.Thread – getState() (depuis Java 1.5) pour connaître l'état d'un processus léger. Expression à l'aide de type énuméré de type Thread.State: ● NEW (pas encore démarré) ● RUNNABLE (en cours d'exécution ou attend une ressource) ● BLOCKED (bloqué en attente d'un moniteur(lock) ● WAITING (attente indéfinie d'une ressource d'un autre thread ● TIMED_WAITING (attente bornée) ● TERMINATED
  • 14. Olivier Curé ­ UMLV [page 14 ] java.lang.Thread : sleep ● La méthode (static) sleep(int) d'un thread force temporairement l'arrêt de son exécution. ● Exemple, arrêt pendant 1 seconde: Thread.sleep(1000);
  • 15. Olivier Curé ­ UMLV [page 15 ] Sleep exemple public class SleepExample implements Runnable { public void run() { long t = System.currentTimeMillis(), x; try { Thread.sleep(300); // on attend 300ms } catch(InterruptedException e) {} x = System.currentTimeMillis(); System.out.println("Attente = "+ (x-t)); } public static void main(String args[]) { Runnable r = new SleepExample(); Thread t = new Thread(r); t.start(); } }
  • 16. Olivier Curé ­ UMLV [page 16 ] Caractéristiques des threads ● Lent au démarrage mais une solution de threads pooling peut être utilisé. ● Augmentation de la complexité du code ● Difficulté du partage des ressources entre plusieurs threads.
  • 17. Olivier Curé ­ UMLV [page 17 ] Gestion des threads ● Pour permettre à plusieurs opérations une exécution concurrente sur un seul processeur, il est nécessaire de transférer le contrôle du processeur d'un thread à un autre. On parle de context switching. ● 2 approches: – Coopératif: un thread délaisse volontairement le processeur – Préemptif: le contrôle du processeur est passé d'un thread à un autre de manière arbitraire.
  • 18. Olivier Curé ­ UMLV [page 18 ] Coopératif vs Préemptif ● Aspect préemptif évite la monopolisation du processeur par un thread, enlève la charge de la gestion du contrôle au programmeur mais ce dernier doit coordonner l'utilisation des ressources partagées par plusieurs threads. ● Avec l'approche préemptive, l'ordre dans d'exécution des threads n'est pas certain. On parle de race condition.
  • 19. Olivier Curé ­ UMLV [page 19 ] Exemple Retourne en générale: Valeur =5 Valeur=10 public class ThreadShare implements Runnable { public int partage=0; public static void main(String args[]) { ThreadShare ts = new ThreadShare(); Thread t1 = new Thread (ts); Thread t2 = new Thread(ts); t1.start(); t2.start(); } public void run() { partage+=5; System.out.println("Valeur ="+ partage); } }
  • 20. Olivier Curé ­ UMLV [page 20 ] Exemple 2 ● Mais on pourrait aussi avoir: valeur=10; Valeur=10 ● Exemple de séquence: – t1 entre dans run() – t1 ajoute 5 à partage (=5) – Context switch – t2 entre dans run() – t2 ajoute 5 à partage (=10) – t2 affiche partage – Context switch – t1 affiche partage
  • 21. Olivier Curé ­ UMLV [page 21 ] Synchronization ● Chaque instance de la classe Object maintient un moniteur (ou lock) et le mot clé synchronized est toujours associé avec ces instances. ● Avant qu'un thread utilise une méthode ou portion de codes synchronisée, il doit obtenir le moniteur de cet objet. ● Si le moniteur a été donné à un autre thread alors il doit attendre une libération du thread (situation de blocage).
  • 22. Olivier Curé ­ UMLV [page 22 ] Synchronization 2 ● En plus du moniteur, chaque objet dispose d'une liste de threads bloqués en attente du moniteur. ● Lorsque le moniteur devient disponible, un des threads de la liste recevra le moniteur et ainsi poursuivra son exécution.
  • 23. Olivier Curé ­ UMLV [page 23 ] Exemple 3 public class ThreadShare implements Runnable { public int partage=0; public static void main(String args[]) { ThreadShare ts = new ThreadShare(); Thread t1 = new Thread (ts); Thread t2 = new Thread(ts); t1.start(); t2.start(); } public void run() { opePartage(); } public synchronized void opePartage() { partage +=5; System.out.println("Valeur ="+ partage); } }
  • 24. Olivier Curé ­ UMLV [page 24 ] Exemple 4 public class ThreadShare2 implements Runnable { public Integer partage=0; public static void main(String args[]) { ThreadShare2 ts = new ThreadShare2(); Thread t1 = new Thread (ts); Thread t2 = new Thread(ts); t1.start(); t2.start(); } public void run() { synchronized(partage) { partage+=5; System.out.println("Valeur ="+ partage); } } }
  • 25. Olivier Curé ­ UMLV [page 25 ] Synchronisation 3 ● Il faut synchroniser un minimum de ligne de codes. ● Synchronisation de méthode ou bien de bloc de codes. ● Deadlock : un thread t1 attend que le thread t2 libère le moniteur d'un objet mais t2 attend le moniteur bloqué par t1. – Solutions: synchronisation de haut niveau ou ordonnancement des blocages.
  • 26. Olivier Curé ­ UMLV [page 26 ] Synchronisation entre processus légers ● 2 solutions proposées dans l'environnement Java: – wait()/notify() – join()
  • 27. Olivier Curé ­ UMLV [page 27 ] Synchronisation entre processus légers ● wait() et notify() des méthodes la classe Object – wait() pour attendre l'arrivée d'un événement particulier. Le thread doit avoir le moniteur. – notify() pour indiquer l'arrivée de cet événement.
  • 28. Olivier Curé ­ UMLV [page 28 ] Producteur/Consommateur class Q { int n; boolean valueSet = false; synchronized int get() { if(!valueSet) try { wait(); } catch(InterruptedException e) { System.out.println("InterruptedException caught"); } System.out.println("Got: " + n); valueSet = false; notify(); return n; } synchronized void put(int n) { if(valueSet) try { wait(); } catch(InterruptedException e) { System.out.println("InterruptedException caught"); } this.n = n; valueSet = true; System.out.println("Put: " + n); notify(); } } class Producer implements Runnable { Q q; Producer(Q q) { this.q = q; new Thread(this, "Producer").start(); } public void run() { int i = 0; while(true) { q.put(i++); } } } class Consumer implements Runnable { Q q; Consumer(Q q) { this.q = q; new Thread(this, "Consumer").start(); } public void run() { while(true) { q.get(); } } } public class ProdCons { public static void main(String args[]) { Q q = new Q(); new Producer(q); new Consumer(q); } }
  • 29. Olivier Curé ­ UMLV [page 29 ] Synchronisation entre processus légers ● join() est une méthode de la classe Thread ● Elle permet d'attendre d'une terminaison ● join() appelé sur l'objet contrôlant un processus léger dont la terminaison est attendue. Le processus courant est interrompu jusqu'à la fin du processus.
  • 30. Olivier Curé ­ UMLV [page 30 ] Join, exemple class Slave implements Runnable { private int value = 0; public int getValue() { return value; } public void run() { for(;value <5;value++) { try { Thread.sleep(200); } catch(InterruptedException e) { System.out.println(e.getMessage()); } } } } class Master implements Runnable { public void run() { Slave slave = new Slave(); Thread slaveThread = new Thread(slave); slaveThread.start(); try { slaveThread.join(); } catch(InterruptedException e) { System.out.println(e.getMessage()); } System.out.println(slave.getValue()); } } public class SlaveMaster { public static void main(String[] args) { Master master = new Master(); Thread masterThread = new Thread(master); masterThread.start(); } } Affiche 0 sans le bloc Affiche 5 avec le bloc.