Académique Documents
Professionnel Documents
Culture Documents
Tous les threads d’un même processus partagent la même zone mémoire.
Un thread possède un nom, une priorité, etc.
Langage
LangageFortran
Java Les threads en Java 2 2
Le concept de processus
Un processus est une instance en exécution d’un programme
Langage
LangageFortran
Java Les threads en Java 3 3
Différences entre un thread et un processus
Au niveau de la mémoire :
Langage
LangageFortran
Java Les threads en Java 4 4
Intérêts des threads en général
Communication très simple grâce aux données partagées
Langage
LangageFortran
Java Les threads en Java 5 5
Threads et Java
Résultat d’exécution
Langage
LangageFortran
Java Les threads en Java 6 6
Comment créer des Threads en Java?
Un thread java est un objet qui control l’exécution d’un programme.
C’est une instance de la classe Thread
Langage
LangageFortran
Java Les threads en Java 7 7
Comment créer des Threads en Java?
Créer Thread avec Thread ou Runnable?
Langage
LangageFortran
Java Les threads en Java 8 8
Comment créer des Threads en Java?
Etendre la classe Thread
public class MyThread extends Thread {
public MyThread(String nom) {
super(nom);
}
public void run() {// corps du thread
for (int i=0; i<3; i++)
System.out.println(" je suis le thread : "+getName());
}
public static void main(String args[ ]) {
new MyThread("Premier thread").start();
new MyThread("Deuxieme thread").start();
}
}
Langage
LangageFortran
Java Les threads en Java 9 9
Comment créer des Threads en Java?
Implanter l'interface Runnable
public class MyExecutable implements Runnable {
String nom;
public MyExecutable(String nom) {
this.nom = nom;
}
@Override
public void run() {// corps du thread
for (int i=0; i<3; i++)
System.out.println(" je suis l’executable: "+ nom);
}
public static void main(String args[ ]) {
new Thread(new MyExecutable("Premier executable")).start();
new Thread(new MyExecutable("Deuxieme executable")).start();
}
}
Langage
LangageFortran
Java Les threads en Java 11 11
Différences avec un appel à run()
public class MyThread extends Thread {
public MyThread(String nom) {
super(nom);
}
public void run() {// corps du thread
for (int i=0; i<3; i++)
System.out.println(" je suis le thread : "+getName());
}
public static void main(String args[ ]) {
new MyThread("Premier thread").run(); //start();
new MyThread("Deuxieme thread").run(); //start();
}
}
Résultat d’exécution
Langage
LangageFortran
Java Les threads en Java 12 12
Quelques méthodes de la classe: java.lang.Thread
Méthode Description
start () Rend un thread exécutable en lançant la méthode run ().
sleep (i) Endort le thread pour i millisecondes.
wait ()* Suspend le thread.
notify ()* Place le thread dans un état exécutable.
notifyAll ()* Réveille tous les threads en attente.
yield () Place le thread de l’état « en cours d’exécution » à l’état «
exécutable ».
setPriority (i) Modifie la priorité d’un thread (i est compris entre
MIN_PRIORITY et MAX_PRIORITY).
join() Pour qu'un deuxième thread attende la fin d'exécution d'un
join (long) premier thread, il suffit d'appeler la méthode join sur le
premier thread. Un paramètre de temps (en millisecondes)
peut être spécifié.
Langage
LangageFortran
Java Les threads en Java 13 13
Simulation de comportement (séquentielle): sans Thread
Simuler le comportement d’une personne
Modèle 1 Modèle 2
Langage
LangageFortran
Java Les threads en Java 14 14
Simulation de comportement (séquentielle): sans Thread
Résultat
class A { d’exécution
void manger() {
Miette 1
for(int i=1;i<=10;i++) Miette 2
System.out.println(" Miette"+i); Miette 3
Miette 4
} Miette 5
} Miette 6
Miette 7
Miette 8
class B { Miette 9
void marcher() { Miette 10
Pas 1
for(int i=1;i<=10;i++) Pas 2
System.out.println(" Pas "+i); Pas 3
} Pas 4
Pas 5
} Pas 6
Pas 7
Pas 8
public class Main{ Pas 9
Pas 10
public static void main(String[] args) {
A a=new A();
B b=new B();
a.manger();
b.marcher();
}
}
Langage
LangageFortran
Java Les threads en Java 15 15
Simulation de comportement (parallèle??): avecThread
class A extends Thread{ Résultat
void manger() {
for(int i=0;i<10;i++) d’exécution
System.out.println(" Miette "+i);
} Miette 0
public void run() { Miette 1
manger(); Miette 2
} Miette 3
} Miette 4
Pas 0
class B extends Thread{ Miette 5
void marcher() { Pas 1
for(int i=0;i<10;i++) Miette 6
System.out.println(" Pas "+i); Pas 2
} Miette 7
public void run() { Pas 3
marcher(); Pas 4
} Miette 8
} Pas 5
Miette 9
public class Main{ Pas 6
Pas 7
public static void main(String[] args) { Pas 8
A a=new A(); Pas 9
B b=new B();
a.start();
b.start();
}
}
Langage
LangageFortran
Java Les threads en Java 16 16
Simulation de comportement (parallèle): avecThread
class A extends Thread{
void manger() { Résultat d’exécution
for(int i=0;i<10;i++) {
System.out.println("Miette "+i); Miette 0
try { Thread.sleep(1000); }catch(Exception exp) {} Pas 0
} Pas 1
} Miette 1
public void run() { Pas 2
manger(); Miette 2
} Pas 3
} Miette 3
class B extends Thread{ Pas 4
void marcher() { Miette 4
for(int i=0;i<10;i++){ Miette 5
System.out.println("Pas "+i); Pas 5
try { Thread.sleep(1000); }catch(Exception exp) {} Miette 6
} Pas 6
Miette 7
} Pas 7
public void run() { marcher(); } Miette 8
} Pas 8
public class Main{ Miette 9
public static void main(String[] args) {
Pas 9
A a=new A();
B b=new B();
a.start();
b.start();
}
}
Pas 0 Miette 0
Le thread a besoin de JVM pour Miette 0 Pas 0
s’exécuter Pas 1
Miette 1
Pas 1
Miette 1
Miette 2 Pas 2
Pas 2 Miette 2
À une unité de temps donnée, un seul Miette 3 Pas 3
Pas 3
thread qui s’exécute Miette 4
Miette
Pas 4
3
Pas 4 Miette 4
Miette 5 Miette 5
Pas 5 Pas 5
Quant il s’agit de plusieurs threads Miette
Pas 6
6 Miette
Pas 6
6
Langage
LangageFortran
Java Les threads en Java 18 18
Thread et JVM
Thread scheduler choisit un Thread à exécuter
Langage
LangageFortran
Java Les threads en Java 19 19
Cycle de vie et les états d’un Thread
Démarrage
du thread
(start()) wating, blocked, sleeping, dead
Non Prêt à s’exécuter: ne sera jamais choisi par la JVM tant qu’il est dans
cet état
Prêt à s’exécuter (runnable): se trouve dans le pool d’exécution et éligible
à s’exécuter mais le scheduler ne l’a pas encore piqué
Le thtread ne peut entrer à cet état seulement si la méthode start() a été appelée
sur lui
Langage
LangageFortran
Java Les threads en Java 20 20
Cycle de vie et les états d’un Thread
class A extends Thread{ Résultat d’exécution
void manger() {
for(int i=0;i<10;i++) { je me suis réveillé plus tard!!
System.out.println("Miette "+i); Entrer à l’école
try { Thread.sleep(1000); }catch(Exception exp) {} Commencer le travail
} Miette 0
} Pas 0
public void run() {
Pas 1
manger();
} Miette 1
} Miette 2
class B extends Thread{ Pas 2
void marcher() { Pas 3
for(int i=0;i<10;i++){ Miette 3
System.out.println("Pas "+i);
Miette 4
try { Thread.sleep(1000); }catch(Exception exp) {}
} Pas 4
Pas 5
} Miette 5
public void run() { marcher(); } Pas 6
} Miette 6
public class Main{
Pas 7
public static void main(String[] args) {
System.out.println("je me suis réveillé plus tard!!"); Miette 7
A a=new A(); Pas 8
B b=new B(); Miette 8
a.start(); Pas 9
b.start(); Miette 9
System.out.println("Entrer à l’école");
System.out.println("Commencer le travail");
} Il faut réglé ce problème !!!!
}
Langage
LangageFortran
Java Les threads en Java 21 21
Influencer le cycle de vie et les états d’un Thread
join()
Utilisé si on souhaite que le thread soit exécuté après l’exécution d’un autre
thread
L’instruction t1.joint() est exécutée par un autre thread t2. Cela signifie
que t2 doit attendre la fin de t1 et reprend son exécution.
Langage
LangageFortran
Java Les threads en Java 22 22
Influencer le cycle de vie et les états d’un Thread
Résultat d’exécution
Utilisation de la méthode join() d’un Thread
je me suis réveillé plus tard!!
Pas 0
Miette 0
public class Main{ Miette 1
public static void main(String[] args) {
Pas 1
System.out.println("je me suis réveillé plus tard!!");
A a=new A(); Pas 2
B b=new B(); Miette 2
a.start(); Pas 3
b.start(); Miette 3
try { Miette 4
a.join();
Pas 4
b.join();
}catch(Exception e) {} Miette 5
System.out.println("Entrer à l’école"); Pas 5
System.out.println("Commencer le travail"); Miette 6
} Pas 6
} Miette 7
Pas 7
Miette 8
Pas 8
Miette 9
Pas 9
Entrer à l’école
Commencer le travail
Langage
LangageFortran
Java Les threads en Java 23 23
Influencer le cycle de vie et les états d’un Thread
Résultat d’exécution
Fixer l’ordre de priorité d’un Thread
je me suis réveillé plus tard!!
Miette 0
public class Main{ Pas 0
public static void main(String[] args) { Miette 1
System.out.println("je me suis réveillé plus tard!!"); Miette 2
A a=new A(); Pas 1
B b=new B(); Miette 3
Miette 4
a.setPriority(Thread.MAX_PRIORITY); Miette 5
b.setPriority(Thread.MIN_PRIORITY); Pas 2
Miette 6
a.start(); Miette 7
b.start(); Pas 3
try { Miette 8
a.join(); Miette 9
b.join(); Pas 4
}catch(Exception e) {} Pas 5
System.out.println("Entrer à l’école"); Pas 6
System.out.println("Commencer le travail"); Pas 7
} Pas 8
} Pas 9
Entrer à l’école
Enlever la méthode « sleep() »!!! Commencer le travail
Exemple de problème
Langage
LangageFortran
Java Les threads en Java 25 25
Synchronisation entre Threads
En programmation parallèle, on appelle section critique, une
partie du code qui ne peut être exécutée en même temps par
plusieurs threads sans risquer de provoquer des anomalies de
fonctionnement
Langage
LangageFortran
Java Les threads en Java 27 27
Synchronisation entre Threads
Langage
LangageFortran
Java Les threads en Java 28 28
Synchronisation entre Threads
Comment synchroniser?
La syntaxe est la suivante :
Le code protégé n'est exécuté que par un seul thread à la fois, tant
qu'il n'a pas terminé le bloc d'instruction.
Langage
LangageFortran
Java Les threads en Java 29 29
Synchronisation entre Threads
Comment synchroniser?
Synchroniser une méthode en sa totalité est le moyen le plus simple
pour assurer qu’un seul thread accède à un code critique
public synchronized void codeProtege() {
... code protégé ...
}
public synchronized void incremente() {
for (int i=0; i<20000;i++) {
contenu++;
System.out.println(getName()+"incremente "+i);
}
Langage
LangageFortran
Java Les threads en Java 31 31
Exemple sans synchronisation sur une variable de classe
class Compteur extends Thread{
private static int valeur=0 ;
void incremente (){
for(int i=0;i<1000;i++) {
Résultat d’exécution
valeur += 1 ;
try { Thread.sleep(100); }catch(Exception exp) {}
}
}
static int Combien () { return valeur ; }
public void run() { incremente(); }
}
public class MainCompteur{
public static void main(String[] args) {
Compteur c1=new Compteur();
Compteur c2=new Compteur();
c1.setName("-compteur 1-"); c2.setName("-compteur 2-");
c1.start(); c2.start();
try { c1.join(); c2.join(); }catch(Exception e) {}
System.out.println("Total:"+Compteur.Combien());
}
}
Langage
LangageFortran
Java Les threads en Java 32 32
Exemple de synchronisation sur une variable de classe
class Compteur extends Thread{
private static int valeur=0 ;
void synchronized incremente (){
for(int i=0;i<1000;i++) {
Résultat d’exécution
valeur += 1 ;
try { Thread.sleep(100); }catch(Exception exp) {}
}
}
static int Combien () { return valeur ; }
public void run() { incremente(); }
}
public class MainCompteur{
public static void main(String[] args) {
Compteur c1=new Compteur();
Compteur c2=new Compteur();
c1.setName("-compteur 1-"); c2.setName("-compteur 2-");
c1.start(); c2.start();
try { c1.join(); c2.join(); }catch(Exception e) {}
System.out.println("Total:"+Compteur.Combien());
}
}