les “threads” Java

publicité
Iremia, R.Courdier
Chapitre 6 : Processus Légers
les “threads”
Java
© Rémy Courdier
1996-2003 - le multitache Java - Version du cours 2.8
1
Sommaire
Les Threads
Utilité des processus légers
La Classe Thread et l’interface Runnable
Implémentation de Runnable
Spécialisation de la classe Thread
Les démons
Le partage de ressources
Bloquer un processus
Les groupes de thread
© Rémy Courdier
03/27/99
1996-2003 - le multitache Java - Version du cours 2.8
2
1
Iremia, R.Courdier
Threads
Utilité des processus légers
Creer des processus séparés,
“indépendants”
2 techniques
Implémenter l’interface Runnable
class x implements Runnable
{
//corps de classe
}
Accéder à la programmation
concurrente (parallèle)
implémenter des mécanismes de
synchronisation et de rendez-vous
gérer des interfaces utilisateurs
sophistiquées
créer des serveurs de réseaux
gestion de graphiques animés
hériter de la classe Thread
class x extends Thread
{
//corps de classe
}
Masquer la complexité des
mécanismes de “time slicing”
© Rémy Courdier
1996-2003 - le multitache Java - Version du cours 2.8
3
Threads
implémentation de Runnable
L’interface Runnable
Une seule fonction run() :
invoquée par la méthode start()
de la classe Thread
Ne permet la création que
d’une Thread pour une
instances de classe donnée
La classe qui implémente
Runnable n’a pas de
possibilités de multi-processing
Il faut qu’elle gere la création d’une
instance de Thread qui prend en
argument un objet “Runnable”
Il faut ensuite appeler start()
sur le thread
le start() appelera alors run()
© Rémy Courdier
03/27/99
/** Fichier Runnable.java */
...
public class T1 extends applet
implements Runnable {
Thread selfThread = null;
...
public void run() {
while(true){...
try {
Thread.currentThread().sleep(50);
} catch(Exception e) {}
...}
}
...
public void declencheThread() {
if (selfThread == null) {
selfThread = new Thread(T1.this);
selfThread.start();
}
}
}
1996-2003 - le multitache Java - Version du cours 2.8
4
2
Iremia, R.Courdier
Threads
spécialisation de la classe Thread
Technique pour creer plusieurs
/** Fichier tabThread.java */
threads associées à une
...
instance d’une classe C
class T extends Thread {
...
On cree une autre classe T
public void run() {
gérée par la classe C
while(true){...
try {
La classe T hérite de Thread
Thread.currentThread().sleep(50);
avec les mécanismes de multi} catch(Exception e) {}
processus
...}
}
Technique plus générale et
public class C extends Applet {
plus ouverte que l’interface
T tabT[] = new T()[10];
Runnable : il est conseillé en
public void init() {...
for (int i;...) s[i]start();
règle générale de l’utiliser
}
la classe T peut être définie
...
comme une inner classe
}
© Rémy Courdier
1996-2003 - le multitache Java - Version du cours 2.8
5
Thread
Les démons
Processus s’exécutant en tache
de fond tant que le programme
tourne
Un démon “meurt” lorsque
l’application se termine
THREAD
DU
MAIN()
AUTRES
THREADS DE
L’APPLI
Méthodes sur les démons :
boolean isDeamon(Thread)
void setDeamon(boolean)
Déclaration :
THREAD DÉMONS
Dans le constructeur (en général) on
possitionne le thread comme étant un
démon :
MaClasseDeamon() {
setDeamon(true);
start();
}
© Rémy Courdier
03/27/99
1996-2003 - le multitache Java - Version du cours 2.8
6
3
Iremia, R.Courdier
Les Threads
Le partage de ressources
Java intègre dans le langage lui-même des éléments de langage
pour gérer le partage de ressources
utilisation du mot clé synchronized
synchronized void f() { /*...*/ }
synchronized void g() { /*...*/ }
si f() est appelée pour une instance i ,
g() ne peut être appelée sur l’instance i tant que f() n’est pas terminée
il y a mise en place automatique d’un principe de vérouillage (lock) des
données de l’instance concernée
performance
un principe de verouillage est un mécanisme couteux
faire des fonctions synchronisées petites pour que le blockage soit le plus court
possible
attention aux problèmes de blockage temporaire de traitement
attention au DeadLock
© Rémy Courdier
1996-2003 - le multitache Java - Version du cours 2.8
7
Les thread
Bloquer un processus
Les 4 états d’un Thread :
New : l’objet thread est créé mais
n’est pas “started”
Runnable : Le “scheduler” prend en
compte cette tache dans son
allocation de temps CPU
Dead : sortie de la méthode run() ou
suite à l’invocation de la méthode
stop() (à éviter car déclenche une
exception)
Blocked : Le “scheduler” n’alloue pas
pas de temps CPU pour le processus
jusqu’à ce qu’elle redevienne
Runnable
© Rémy Courdier
03/27/99
Cas de blockage d’un Processus
sleep(milliseconds)
suspend()...
...resume()
wait()...
...notify() ou notifyAll()
attente de terminaison d’une
entrée/sortie
méthode synchronisée qui
block l’accés à l’instance
1996-2003 - le multitache Java - Version du cours 2.8
8
4
Iremia, R.Courdier
Les threads
Priorités
Java permet d’associer un niveau de priorité à chaque
thread
Cette information est exploitée par le scheduler lors de
son partage de temps CPU aux processus
Variable utiles
Thread.MAX_PRIORITY
Thread.MIN_PRIORITY
Par défaut la priorité est 5 en Java 1.1
Méthodes utiles :
getPriority()
setPriority()
© Rémy Courdier
1996-2003 - le multitache Java - Version du cours 2.8
9
Les thread
Les groupes de thread
Un thread appartient à un groupe
Par défaut un thread appartient au groupe “system”
Creation
public static void main (...) {...
ThreadGroup x = new ThreadGroup (“GroupeX”);
ThreadGroup y = new ThreadGroup (“GroupeY”);
Thread t1 = new T1(x, “t1”);
Thread t2 = new T2(y, “t2”);
}
...
class T1 extends Thread {
...
T1(ThreadGroup g, String name) {
super (g, name);
}
}
© Rémy Courdier
03/27/99
1996-2003 - le multitache Java - Version du cours 2.8
10
5
Téléchargement