PROGRAMMATION ORIENTEE OBJET AVANCEE �Java Avancée
Par F. Guerouate
1
Objectifs:
2
3
Introduction
Programmation multitâche:
Tous les systèmes d'exploitation actuels ont la possibilité d'effectuer plusieurs tâches en simultanée.
4
Introduction
5
Threads et processus
6
7
8
Le "faux multitâche"
9
10
11
Un exemple de thread
12
13
14
15
16
17
La création des Threads
L'objet thread de Java
Pour créer des Threads…
« écrire une méthode run() qui fait
ce que doit faire le thread. »
18
Méthode 1
La première méthode s’avère irréaliste étant donné que la plupart du temps, vos propres classes hériteront déja d’une autre classe et par conséquent, ne pourront pas hériter de plusieurs classes. En Java, l’héritage multiple n’est pas supporté.
Néanmoins, si votre classe n’hérite aucune autre, il est préférable de la faire hériter de la classe ‘Thread’.
19
✔ Cette classe hérite de la classe Thread (méthode 1).
20
21
Exemple Méthode 1
22
23
Exemple méthode 1
Le résultat de l’exécution:
A0 B0 A1 B1 A2 A3 A4 B2 A5 B3 A6 A7 B4 B5 B6 B7
24
✔ Cette classe implémente l'interface Runnable, surcharge la méthode run et contient un champ de type Thread (méthode 2).�
25
26
Exemple methode2
27
28
29
Exemple méthode 2
Le résultat de l’exécution:
A0 B0 A1 B1 A2 A3 B2 A4 A5 B3 A6 A7 B4 B5 B6 B7
30
31
Constructeurs de thread
32
Quelques méthodes
33
Propriétés des threads
⮚Nouveau : Le thread a été crée avec new mais n'est pas encore activé
⮚Exécutable : La méthode start a été appelée mais cela ne signifie pas que le thread est exécuté. Cela va dépendre du système d'exploitation qui doit lui donner une fenêtre d'exécution.
34
⮚Bloqué : Plusieurs évènements peuvent bloquer un thread. La méthode sleep lorsqu'elle est appelée, met le thread dans cet état.
⮚Mort : Lorsque la méthode run est terminée, le thread est considéré comme mort.
35
Cycle de vie d’un thread
1. Au début, un thread occupe un espace mémoire, mais il n’a pas été démarré. Il n’est pas encore vivant et un appel de sa méthode isAlive retournera faux.�2. Ensuite on appelle la méthode « start() » du thread ce qui le fait « naître ». Il devient vivant et commence l’exécution de sa méthode « run() ». Un appel à sa méthode isAlive retournera vrai.
3. Pendant qu’il est en exécution, un thread peut « laisser la main » avec un appel de la méthode yield.
36
4. Pour passer en mode « non exécutable » (non runnable), il faut qu’une des trois conditions suivantes soit remplie :
5. Pour revenir en mode exécutable selon la raison qui les a rendus non exécutables :
37
6. Pour mourir, un thread doit terminer sa méthode « run » ou propager une exception hors de celle-ci.
38
Gérer la répartition du temps entre les threads
39
Planification d’un thread
40
41
42
43
public class Horlogerie {
public static void main(String Args[]) throws InterruptedException{
System.out.println("Min: "+Thread.MIN_PRIORITY);
System.out.println("Max: "+Thread.MAX_PRIORITY);
Chrono T[]=new Chrono [5];
T[0]=new Chrono(9,"Tortue");
T[1]=new Chrono(6,"Poisson");
T[2]=new Chrono(3,"Chat");
T[3]=new Chrono(2,"Cheval");
T[4]=new Chrono(1,"Tigre");
44
for(int i=0;i<5;i++)
System.out.println(T[i].getName() + "status: "+T[i].isAlive());
for(int i=0;i<5;i++)
T[i].start();
for(int i=0;i<5;i++)
System.out.println(T[i].getName() + "status: "+T[i].isAlive());
T[4].join();
System.out.println("=============================");
for(int i=0;i<5;i++)
T[i].Arret();
45
class Chrono extends Thread{
private int compte;
private int attent;
private boolean continuer;
public Chrono(int vitesse,String Nom){
super(Nom);
setPriority(1);
if(Math.abs(vitesse)>10)
vitesse=10;
attent=Math.abs(vitesse)*1000;
compte=0;
continuer=true;
}
46
public void run(){
while(continuer && compte<10)
{
System.out.println(getName()+" : "+ compte);
compte++;
long T=System.currentTimeMillis();
while(System.currentTimeMillis()-T<attent);
}
System.out.println(getName()+" est mort ******");
}
public void Arret(){ continuer=false;}
}
47
Min: 1
Max: 10
Tortuestatus: false
Poissonstatus: false
Chatstatus: false
Chevalstatus: false
Tigrestatus: false
Tortue : 0
Poisson : 0
Chat : 0
Cheval : 0
Tortuestatus: true
Poissonstatus: true
Chatstatus: true
Chevalstatus: true
Tigrestatus: true
Tigre : 0
Tigre : 1
Cheval : 1
Tigre : 2
Chat : 1
Tigre : 3
Cheval : 2
48
Tigre : 4
Tigre : 5
Chat : 2
Cheval : 3
Poisson : 1
Tigre : 6
Tigre : 7
Cheval : 4
Tigre : 8
Chat : 3
Tortue : 1
Tigre : 9
Cheval : 5
Tigre est mort ******
=============================
Chat est mort ******
Poisson est mort ******
Cheval est mort ******
Tortue est mort ******
L’interface Runnable, force la définition dans la classe d’une méthode : public void run()
49
50
51
52
53
54
Deux exemples un seul concept
55
Remarque
56
Mot clé synchronised
57
58
59
60
61
Solution : synchronized
62
63
64
Verrous d'objets (Les moniteurs)
65
wait et notify
66
Remarque :
67
Exemple: producteur consommateur
68
69
L’objet partagé
70
71
72
73
Résumé
74
75
76
Groupes de threads
77
78
79
Java.lang.ThreadGroup
Utilisez le constructeur suivant :
ThreadGroup g = new ThreadGroup("WebImages0047654");
Pour ajouter des threads à ce groupe :�Thread th = new Thread (g, "Image1");
80
�
Les groupes permettent de facilement manipuler de manière simultanée tous les éléments du groupe.
81
82
83
84
85
86
87
88
89
Ainsi, un sémaphore est un objet possédant deux attributs :
90
91
92
93
Ressources
94