Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parMarthe Vignon Modifié depuis plus de 10 années
1
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV Threads Module Java Expert
2
Module UV Java Page 2 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Module Java n Vue densemble du langage Java n Le langage Java : syntaxe et sémantique n Programmation multi-tâche : les threads n Accéder aux bases de données n Composants réutilisables : le modèle MVC n Développement Client/Serveur n Présentation dun IDE : WSAD / Forté / JBuilder n Les serveurs dapplications J2EE n Les Enterprise JavaBeans n Ré-ingénierie dapplications Java
3
Module UV Java Page 3 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Les Threads Java n Un thread nest pas un objet n Un thread est un flot de contrôle n Un thread est une série dinstructions à exécuter n Un thread est une séquence imbriquée dappels de méthodes
4
Module UV Java Page 4 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Utilisation des Threads n Fenêtres Multiples n Calcul en tâche de fond n Animation n Producteur/consommateur n Serveur avec plusieurs clients (web ou autres) n Recherche (base de données, web)
5
Module UV Java Page 5 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle LObjet Thread n Un thread nest pas un objet n Un Thread est un objet et possède un cycle de vie Les Threads partagent la mémoire (processus) void start() –Crée un nouveau thread et le rend exécutable void run() –Le nouveau thread commence sa vie dans cette méthode
6
Module UV Java Page 6 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
7
Module UV Java Page 7 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
8
Module UV Java Page 8 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
9
Module UV Java Page 9 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
10
Module UV Java Page 10 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
11
Module UV Java Page 11 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
12
Module UV Java Page 12 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
13
Module UV Java Page 13 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
14
Module UV Java Page 14 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Diagrame de Création Thread Thread t = new BThread(); t.start(); Continuer(); Objet A BThread() { } void start() { // creation thread } void run() { FaireTravail(); } Objet BThread (extends Thread)
15
Module UV Java Page 15 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle LInterface Runnable n Lobjet thread implémente cette interface n La méthode run() de lobjet Thread appelle celle de lobjet Runnable n Ceci permet à des threads de sexécuter dans nimporte quel objet, sans utiliser lhéritage.
16
Module UV Java Page 16 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Exemple dobjet Runnable //Création de lobjet pouvant être indépendant Imprimante imprimante = new Imprimante(); //lobjet devient indépendant Thread t = new Thread(imprimante); t.start();//appel de run() /******************************************/ class Imprimante implements Runnable { public void run() { while (true) { //boucle infinie System.out.println(Imprimante Prête); }}}
17
Module UV Java Page 17 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Exemple dobjet Runnable //Création de lobjet pouvant être indépendant Imprimante imprimante = new Imprimante(); //lobjet devient indépendant imprimante.start();//appel de run() /******************************************/ class Imprimante implements Runnable { Thread t = null; public void start() { t = new Thread(this);// le thread est interne t.start();// le thread est lancé } public void run() { while (true) { //boucle infinie System.out.println(Imprimante Prête); }}}
18
Module UV Java Page 18 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Cycle de vie dun Thread Né Bloqué Exécutable Mort stop() start() stop() Actif Bloquer sur I/O I/O disponible JVM sleep(500) réveiller suspend() resume() attendre notifier
19
Module UV Java Page 19 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Blocage des Threads n Lorsque il y a une lecture depuis un flux, si lentrée nest pas disponible, le thread sera bloqué n Thread est suspendu (bloqué) jusquà ce que les I/O sont disponibles n Permettre aux autres threads dêtre actif automatiquement n Lorsque les I/O sont disponibles, thread se réveille et devientexécutable
20
Module UV Java Page 20 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Ordonnancement du Thread n En général, le thread exécutable avec la plus haute priorité est activé (running) n Java est priority-preemptive –Si un thread de haute-priorité se réveille, et un thread de basse priorité sexécute –Alors le thread de haute priorité sexécute immédiatement n Permet lexécution à la demande –utilisation efficace du CPU
21
Module UV Java Page 21 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Famine dun Thread n Si un thread de haute priorité nest jamais bloqué. n Alors tous les autres threads seront en attente de CPU, et ne travailleront jamais. n Prudence au niveau de la priorité dun thread.
22
Module UV Java Page 22 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Priorités dun Thread : Stratégies Générale n Threads qui ont beaucoup de travail à réaliser, devrait avoir une priorité plus faible. n Donner une priorité élever pour les tâches courtes. n Donner aux threads devant faire des I/O une haute priorité. –se réveiller, calculer immédiatement les données, attendre de nouveau les I/O.
23
Module UV Java Page 23 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Les Conditions de la Course n Deux threads modifient simultanément un objet n Les deux threads courent pour stocker leurs valeurs n Au final, le dernier gagne la course n (En fait, les deux perdent)
24
Module UV Java Page 24 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Exemple de Conditions de Course class Compte { int solde; public void depot(int valeur) { int nouveauSolde; nouveauSolde = solde + valeur; solde = nouveauSolde; return ; }
25
Module UV Java Page 25 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Exemple de Conditions de Course class Compte { int solde; public void depot(int valeur) { int nouveauSolde; nouveauSolde = solde + valeur; solde = nouveauSolde; return ; } Que se passe-t-il si lOrdonnanceur change les threads ici?
26
Module UV Java Page 26 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Synchronisation de Thread Mot clé du Langage : synchronized n Apporte un lock sur un objet –Lock exclusif pour le thread n Si le lock nest pas disponible, le thread sera bloqué
27
Module UV Java Page 27 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Exemple Synchronization class Compte { private int solde; synchronized public void depot(int valeur) { int nouveauSolde; nouveauSolde = solde + valeur; solde = nouveauSolde ; } synchronized public void retirer(int valeur) { int nouveauSolde ; nouveauSolde = solde - valeur; solde = nouveauSolde ; }
28
Module UV Java Page 28 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Synchronisation de Thread n Protège laccès au code, pas aux données –Faire des membres de données privé –Synchroniser les méthodes daccès aux données n Mettre un champs de force autour de lobjet bloqué, afin quaucun autres threads ne puissent entrer Actuellement, on bloque uniquement laccès aux autres threads synchronisés
29
Module UV Java Page 29 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Inter-blocage de Threads (Deadlock) n Si deux threads sont en compétition pour plus dun lock n Exemple: transfert bancaire entre deux comptes –Thread A possède un lock sur le compte 1 et veut un lock sur le compte 2 –Thread B possède un lock sur le compte 2 et veut un lock sur le compte 1
30
Module UV Java Page 30 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Eviter le Deadlock n Pas de solutions universelles n Ordonné l acquisition dun lock n Timeout n Minimiser ou supprimer la synchronisation
31
Module UV Java Page 31 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Wait et Notify n Permettre à deux threads de coopérer n Basé sur un objet lock simple partagé
32
Module UV Java Page 32 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Wait et Notify: Code n consommateur: synchronized (lock) { while (!resourceAvailable()) { lock.wait(); } consumeResource(); }
33
Module UV Java Page 33 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Wait and Notify: Code n Producteur: produceResource(); synchronized (lock) { lock.notifyAll(); }
34
Module UV Java Page 34 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupèrer le lock 8. Retour du wait() 9. consumeResource(); 10. }
35
Module UV Java Page 35 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupèrer le lock 8. Retour du wait() 9. consumeResource(); 10. }
36
Module UV Java Page 36 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupèrer le lock 8. Retour du wait() 9. consumeResource(); 10. }
37
Module UV Java Page 37 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupèrer le lock 8. Retour du wait() 9. consumeResource(); 10. }
38
Module UV Java Page 38 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupèrer le lock 8. Retour du wait() 9. consumeResource(); 10. }
39
Module UV Java Page 39 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupèrer le lock 8. Retour du wait() 9. consumeResource(); 10. }
40
Module UV Java Page 40 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupèrer le lock 8. Retour du wait() 9. consumeResource(); 10. }
41
Module UV Java Page 41 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupèrer le lock 8. Retour du wait() 9. consumeResource(); 10. }
42
Module UV Java Page 42 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupérer le lock 8. Retour du wait() 9. consumeResource(); 10. }
43
Module UV Java Page 43 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupérer le lock 8. Retour du wait() 9. consumeResource(); 10. }
44
Module UV Java Page 44 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Séquence du Wait/Notify Objet Lock Consommateur Thread Producteur Thread 1. synchronized(lock){ 2. lock.wait(); 3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.} 7. Récupérer le lock 8. Retour du wait() 9. consumeResource(); 10. }
45
Module UV Java Page 45 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Wait/Notify: Détails n Souvent lobjet lock est la ressource elle-même n Parfois lobjet lock est le thread producteur lui-même
46
Module UV Java Page 46 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Wait/Notify: Détails n Doit Boucler sur le wait(), dans le cas où dautres thread sapproprient la ressource... –Après que vous êtes notifiés –Avant que vous acquérez le lock et que vous récupérez la main suite au wait() n Utiliser lock.notifyAll() si il y a plus dun thread en attente
47
Module UV Java Page 47 / 47 Deruelle Laurent Copyright © 2002 Laurent Deruelle Exemple Wait/Notify : Queue Bloquante class BlockingQueue extends Queue { public synchronized Object remove() { while (isEmpty()) { wait(); // really this.wait() } return super.remove(); } public synchronized void add(Object o) { super.add(o); notifyAll(); // this.notifyAll() }
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.