Title: DEUG MIAS Option Info Introduction JAVA
1DEUG MIAS Option Info Introduction à JAVA
- Olivier Sigaud
- LIP6/AnimatLab
- olivier.sigaud_at_lip6.fr
- 01.44.27.88.53
2Plan du cours 9Threads et Réflexivité
- Threads
- Définition
- Création des Threads
- Gestion des priorités
- Synchronisation
- Réflexivité
3Définition
- Thread séquence autonome dexécution
dinstructions au sein dun programme
- Donne lillusion de parallélisme sur une machine
monoprocesseur - Délivre un parallélisme réel sur une machine
multiprocesseur
4Nature des Threads
- Un Thread est un processus
- Léger pas de réservation de ressources système
(fichiers, canaux, signaux), - Simple 1 registre Compteur de Programme et une
pile. - Sur un ordinateur, à un instant donné,
- il ny a quUN SEUL THREAD en cours dexécution,
et éventuellement dautres threads en attente
dexécution
5Mémoire partagée
- Tous les Threads partagent le même espace mémoire
au sein de la machine virtuelle - Ils peuvent accéder à tous les objets publics
- Ils peuvent modifier tous les objets publics
6Lancement des Threads
- Au démarrage de la JVM,
- création dun seul Thread, qui appelle la méthode
main(String args) de la classe principale - La JVM continue dexécuter les threads jusquà ce
que - la méthode exit() de la classe Runtime soit
appelée (si permission du security manager) - tous les threads soient morts, soit par fin de la
méthode run(), soit par propagation dune
exception hors de la méthode run().
7Pour créer des Threads
- Deux méthodes, un point commun
- écrire une méthode run() qui fait
- ce que doit faire le thread.
- Méthode 1 Dériver une classe de Thread.
- Méthode 2 implémenter linterface Runnable.
8Linterface Runnable
- interface Runnable
-
- public abstract void run()
-
- Un objet runnable est un objet que lon peut
lancer en faisant run()
9La classe Thread
- public class Thread implements Runnable
- public static final int MAX_PRIORITY, MIN
_PRIORITY, NORM _PRIORITY - public Thread()
- public Thread(String name)
-
- public static Thread currentThread()
- public static void sleep(long millis)
- public static void yield()
- public static void suspend()
- public static void resume()
-
- public static void start()
- public static void stop()
- public static void run()
-
-
10- Dériver une classe de Thread
public class SimpleThread extends Thread
public void run() while(true)
Quelque part.
Partie Utile
SimpleThread unSimpleThread new
SimpleThread() unSimpleThread.start()
Ailleurs...
11- Implémenter linterface Runnable
public class Clock implements Runnable public
void run() while(true)
Quelque part.
Partie Utile
Clock uneClock new Clock() Thread thread
new Thread(uneClock) thread.start()
Cible Runnable
Ailleurs...
12Etats dun thread (cycle de vie)
IllegalThreadStateException
Naissance
mort
fin de run()
start()
- I/O bloquante
- wait()
- sleep()
Executable
Non Executable
- délai écoulé
- notify()
- I/O débloquée
13Comment arrêter un thread ?
- Pas de méthode ad-hoc
- (stop, suspend, etc. sont DEPRECATED)
- Il faut que la méthode run() termine delle-même
Exemple public void run() (1) while
(compteur lt 100000) (2) while (varBool
true)
14Gestion des Threads
- Pour le système, gérer des threads, cest.
- Gérer le partage du temps
-
- Gérer des priorités
- Modèle de gestion des threads par la JVM
- fixed priority scheduling (algorithme
déterministe)
15Gestion par priorités assignées
Priorité croissante
manège (round robin)
thread de priorité supérieure gt Préemption.
Il est préférable que chaque thread rende la main
de manière volontaire (éviter les threads
égoïstes)
16Certaines implémentations de Java permettent un
vrai temps partagé Exemple 2 threads de
priorité identiques sont alternativement
choisisDautres implémentations ne le
permettent pas
Une Difficulté
17Green threads et native threads
- Green thread thread dorigine
- Native thread dépend de limplémentation
MonoProcesseur
MultiProcesseur
18- Native Threads
- reposent en général sur une implémentation
efficace de multithreading par le système
dexploitation - bonne rotation entre threads, pas de famine..
- Green Threads
- une simulation de multithreading,
- noffre quUNE GARANTIE la préemption en cas de
priorité supérieure. - UN RISQUE la famine.
- Donc Que vos threads soient polis !
- (quils rendent la main deux-mêmes.)
19Gestion des priorités (1)
- Chaque thread possède une priorité
- égale à NORM_PRIORITY (5)
- définie entre MIN_PRIORITY (1) et MAX_PRIORITY
(10), - constantes de la classe Thread
- A tout moment, quand plusieurs threads sont
runnables, le thread de plus haute priorité est
choisi. - Si ce thread stoppe ou est suspendu pour une
raison quelconque, alors, un thread de priorité
inférieure peut sexécuter.
20Gestion des priorités (2)
- Si un thread de priorité supérieure doit
sexécuter (fin de sleep(), fin dI/O,
notify()), il y a préemption. - Le Runtime Java ne fera pas de préemption dun
thread pour un autre de même priorité. - Le runtime Java ne fait pas de time-slicing .
- MAIS, il se peut que lOS sous-jacent SUPPORTE le
time-Slicing - Moralité nécrivez pas de code dont le
fonctionnement repose sur le time-slicing.
21Exercice 1
- Ecrire une classe Ping qui réalise un Thread qui
affiche Ping à intervalle irrégulier - Ecrire une classe Pong qui réalise un Thread qui
affiche Pong à intervalle irrégulier - Ecrire une classe Go qui lance les Threads Ping
et Pong
22Exercice 1 (1)
- import java.io.
- class Ping extends Thread
- public void run()
- try
- while (true)
- System.out.println( Ping )
- sleep((long)500Math.random())
-
-
- catch(InterruptedException e) return
-
-
23Exercice 1 (2)
import java.io. class Pong extends
Thread public void run() try while
(true) System.out.println( Pong ) slee
p((long)500Math.random()) catch(Int
erruptedException e) return
24Exercice 1 (3)
- import java.io.
- class Go
- public static void main(String args)
-
- Ping p1 new Ping()
- Pong p2 new Pong()
- p1.start()
- p2.start()
-
25La Synchronisation
26Synchronisation. Pourquoi (1)?
Tous les objets sont partagés entre tous les
Threads
lecture
Objet UnObjet
lecture
calcul
double var
calcul
écriture
écriture
2 sections critiques non protégées
Thread 1
Thread 2
27Section critique
- Comment protéger une section critique ?
- En java, par un bloc synchronized (bloc,
méthode) - Un seul thread accède au code synchronized à un
moment donné. - Protection efficace mais basique.
- wait() met le thread en attente (sans perte de
cycles CPU) et relâche le verrou - notify() et notifyAll() libèrent un ou tous les
threads de létat wait
28Producteur/Consommateur
- Un drapeau indique quune valeur a été
déposée - Un drapeau indique quune valeur a été
consommée
FichierObjet..
Méthode traditionnelle Attente active
Thread 1 (producteur)
Thread 2 (consommateur)
29Exercice 2
- Ecrire une classe Sem qui implémente un sémaphore
elle contient un champ booléen curval et deux
méthodes get(boolean val) et set(boolean val). - La méthode get(boolean val) attend que curval
soit égal à val pour continuer - La méthode set(boolean val) positionne curval à
val - Get et set définissent une section critique
30Exercice 2 (2)
- Modifier les classes Ping et Pong pour quelles
affichent leur message chacune à leur tour
31Solution Exercice 2 (1)
- class Sem
- boolean curval
- Sem()curvaltrue
- synchronized boolean get(boolean val)
- while (val!curval)
- trywait()catch(Exception e)
-
- return true
-
-
- synchronized voit set(boolean val)
- curvalval
- notify()
-
-
32Solution Exercice 2 (2)
- import java.io.
- class Ping extends Thread
- boolean semvaltrue
- Sem m
- public Ping(Sem m0)mm0
- public void run()
- try
- while (true)
- m.get(semval)
- System.out.println( Ping )
- m.set(!semval)
- sleep((long)200Math.random())
-
- catch(InterruptedException e) return
-
-
33Solution Exercice 2 (3)
- import java.io.
- class Pong extends Thread
- boolean semvalfalse
- Sem m
- public Pong(Sem m0)mm0
- public void run()
- try
- while (true)
- m.get(semval)
- System.out.println( Pong )
- m.set(!semval)
- sleep((long)200Math.random())
-
- catch(InterruptedException e) return
-
-
34La Réflexivité
35Réflexivité
- Introspection
- Un objet peut ltlt inspecter gtgt sa classe
- Lenvironnement Java peut manipuler les classes
dune application. - Exemples dutilisation
- Debuggers,
- Environnements danalyse,
- Espions
- Moyens
- La classe dun objet EST un objet
- Une classe quelconque est récupérable sous cette
forme. - Les champs dune classe SONT des objets.
36Méthodes pour la réflexivité
Dans un source Java if (monObjet instanceof
MaClasse) Vérifie si l'objet monObjet est bien
du type (ou sous-type de) MaClasse Méthode de
java.lang.Object public final Class getClass()
Renvoie la classe de l'objet (un objet de la
classe Class !) Méthode de java.lang.Class
public Class getInterfaces() Retourne un
tableau des Constructeurs publics. Méthode de
java.lang.Class public String getClass().getName(
) Renvoie le nom dune Classe
37Méthodes de java.lang.Class
public Field getDeclaredFields()
throws SecurityException Retourne un
tableau des champs non hérités. public Method
getDeclaredMethods()
throws SecurityException Retourne un tableau des
méthodes non héritées. public Constructor
getConstructors()
throws SecurityException Retourne un tableau des
constructeurs publics.
38java.lang.reflect
- java.lang.reflect contient et définit les Classes
- Field (attribut)
- Array (création dynamique de tableaux)
- Method (méthode dune classe)
- Laccès à la réflexivité se fait sous contrôle du
security manager.
39Lheure, cest lheure !