La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

PROGRAMMATION MULTI-TÂCHES (MULTITHREADING). IFT10202 OBJECTIFS Comprendre comment un programme peut être fragmenté et exécuté en parallèle. Apprendre.

Présentations similaires


Présentation au sujet: "PROGRAMMATION MULTI-TÂCHES (MULTITHREADING). IFT10202 OBJECTIFS Comprendre comment un programme peut être fragmenté et exécuté en parallèle. Apprendre."— Transcription de la présentation:

1 PROGRAMMATION MULTI-TÂCHES (MULTITHREADING)

2 IFT10202 OBJECTIFS Comprendre comment un programme peut être fragmenté et exécuté en parallèle. Apprendre à implanter de tels programmes. Comprendre les principes de compétition (race) et dinter-blocages (deadlocks). Apprendre à éviter le problème de corruption dobjets en utilisant les méthodes synchronisées. Utiliser la programmation multi-tâches pour faire des animations.

3 IFT10203 CODES Souhait.java CompteBanqueThread.java SelectionThread.java

4 IFT10204 Tâches légères (Threads) Une tâche légère est un processus léger correspondant à lexécution dun petit programme, ou dune routine dun programme plus gros, indépendamment de celui-ci. La machine virtuelle de Java (JVM) exécute les tâches légères dun tel programme en allouant de petits fragments de temps à chacun. –Cette façon de faire donne limpression dune exécution en parallèle des tâches légères (multithreads).

5 IFT10205 Étapes pour exécuter des tâches légères Il faut implanter une classe qui étend (extends) la classe Thread. Placer le code dune tâche dans la méthode run de votre classe. Créer un objet de votre classe. Appellez la méthode start de votre classe pour démarrer la tâche. Quand un objet Thread est démarré, son code est exécuté dans une nouvelle tâche légère.

6 IFT10206 Envoyer des souhaits ! Un programme qui imprime un souhait a chaque seconde pour 10 secondes : public class SouhaitThread extends Thread { public void run() { // les actions du thread... } // déclarations des variables utilisées par les actions du thread... }

7 IFT10207 Laction de la tâche pour SouhaitThread Imprimer le temps Imprimer le souhait Attendre une seconde

8 IFT10208 SouhaitThread On va chercher le temps avec un objet de type Date : Date maintenant = new Date(); Pour attendre une seconde, on peut utiliser la méthode sleep de la classe Thread : sleep(millisecondes); Une tâche légère qui dort peut générer une exception de type InterruptedException On peut attraper cette exception Faire le nécessaire le cas échéant

9 IFT10209 La méthode run de SouhaitThread public run() { try { //action } catch (InterruptedException exception) { //faire ce quil faut faire dans ce cas }

10 IFT Allons voir le code de SouhaitThread.java …

11 IFT Pour démarrer la tâche Construire un objet de la classe SouhaitThread SouhaitThread t = new SouhaitThread(Allô le monde!"); Lancer la méthode run avec t.start();

12 IFT Allons voir le code de SouhaitThreadTest.java …

13 IFT Synchronisation des tâches La synchronisation des tâches (task scheduler) exécute chaque tâche pour un court moment, quon appelle une tranche de temps. Après avoir alloué une tranche de temps à une tâche, une autre tâche exécutable est choisie et sa tranche accordée. Une tâche est exécutable si elle nest pas endormie (asleep) ni bloquée. Lordre dexécution des tâches nest pas garantie.

14 IFT Terminaison des tâches… Une tâche termine quand sa méthode run termine. Il nest pas conseillé de terminer une tâche avec la méthode stop. Plutôt, notifier la terminaison dune tâche avec t.interrupt();

15 IFT Terminaison des tâches La méthode run dune tâche devrait vérifier occasionnellement si elle a été interrompue : Utiliser la méthode isInterrupted. Normalement, une tâche interrompue doit relâcher ses ressources et sortir. La méthode sleep lance lexception InterruptedException même si la tâche interrompue est endormie. Dans tous les cas, attraper lexception et terminer la tâche.

16 IFT Terminer une tâche public void run() { try { for(int i = 1; i <= REPETITIONS && !isInterrupted(); i++) { //action } catch (InterruptedException exception) { } //Sortie }

17 IFT Données corrompues par des tâches mal synchronisées Quand des tâches différentes partagent un objet commun, elles peuvent entrer en conflit. Dans lexemple qui suit, un DepotThread et un RetraitThread manipulent un seul objet CompteBanque.

18 IFT Méthode run de DepotThread public void run() { try { for(int i = 1; i <= REPETITIONS && !isInterrupted(); i++) { compte.depot(montant); sleep(DELAI); } catch (InterruptedException exception) { }

19 IFT Application Créer un objet CompteBanque. Créer un DepotThread t0 pour déposer $100 dans le compte 100 fois. Créer un RetraitThread t1 pour retirer $100 du compte 100 fois. Le résultat à la fin devrait être zéro,… mais pas toujours !!!

20 IFT Scénario pour expliquer ce phénomène La tâche t0 exécute les instructions System.out.print("Dépôt " + montant); double nouvelleBalance = balance + montant; t0 atteint la fin de sa tranche de temps et… t1 prend le contrôle… t1 appelle la méthode retrait qui retire $100 de la variable balance. La balance est de -$100 plutôt que $0 !!! t1 sendore…

21 IFT Scénario du phénomène (suite) t0 reprend le contrôle et continue là où il a laissé. t0 exécute les lignes : System.out.println(", nouvelle balance " + nouvelleBalance); balance = nouvelleBalance; La balance est maintenant $100 plutôt que $0 parce que la méthode depot utilise la vieille version (une copie locale) de balance. La corruption des données est causée par la compétition des codes pour les traiter, en anglais le terme race condition est utilisé.

22 IFT Race condition Survient quand la mise à jour de données dépend de lordre de synchronisation de plusieurs tâches. Il est possible quune tâche soit arrêtée (sa tranche de temps terminée) en plein milieu dun énoncé ! –Par exemple, elle peut évaluer le côté droit dune assignation sans avoir le temps de stocker le résultat dans la variable de gauche de lénoncé. Lassignation pourrait être complétée seulement lors de sa prochaine reprise dexécution et tranche de temps alloué.

23 IFT Corruption du champ balance

24 IFT Allons voir le code de CompteBanqueThread.java …

25 IFT Solution au problème de compétition Une tâche doit être capable de bloquer temporairement un objet. Quand une tâche a le contrôle dun objet, aucune autre tâche ne peut modifier létat de cet objet. En Java, on utilise les méthodes synchronisées. On marque les méthodes contenant du code pouvant corrompre des données avec le mot clé synchronized.

26 IFT Méthodes synchronisées public class CompteBanque { public synchronized void depot(double montant) {... } public synchronized void retrait(double montant) {... }... }

27 IFT Méthodes synchronisées En déclarant que les méthodes depot et retrait sont synchronisées : oNotre programme roulera correctement. oSeulement une tâche à la fois pourra exécuter ses méthodes sur un objet donné, comme le compte de banque dans lexemple. oQuand une tâche démarre une de ses méthodes, elle est assurée de la complétion du code de cette méthode avant quune autre tâche puisse en prendre le contrôle, en exécutant lune de ses méthodes synchronisées.

28 IFT Méthodes synchronisées En exécutant une méthode synchronisée : oLa tâche bloque lobjet. oAucune autre tâche ne peut bloquer ou modifier un objet déjà bloqué avant que la tâche qui la bloqué termine.

29 IFT Visualisation de tâches synchronisées Imaginez un line-up à la salle de bain… Les tâches sont les personnes. Si la salle de bain est vide, une personne peut entrer. Si une 2ième personne trouve la salle de bain barrée, elle doit attendre jusquà ce quelle se libère. Si plusieurs personnes veulent aller à la salle de bain, elles doivent toutes attendre. Les personnes ne forment pas nécessairement une file dattente ordonnée. Une personne choisie au hasard peut avoir accès quand la salle de bain devient disponible.

30 IFT Blocage (deadlock) Un blocage survient si aucune tâche ne peut procéder parce que chaque tâche est en train dattendre quune autre fasse quelque chose dabord. Dans lexemple du compte de banque… public synchronized void retrait(double montant) { while(balance < montant) //attendre que la balance augmente... }

31 IFT Blocage Cette méthode peut mener à un blocage. La tâche peut dormir et attendre que la balance augmente mais cest elle qui bloque le compte. Aucune autre tâche ne peut exécuter la méthode synchronisée de dépôt. Si une tâche appelle depot, elle bloque jusquà ce que retrait relâche le compte. Mais retrait ne peut relâcher le compte tant que des fonds supplémentaires ne sont pas déposés. BLOCAGE !

32 IFT Éviter les blocages La méthode wait relâche temporairement un objet bloqué et désactive la tâche. Salle de bain… oOn ne veut pas quune personne dans la salle de bain sendorme parce quil ny a plus de papier ! oImaginez que la personne abandonne et quitte la salle de bain. oCela permet à une autre personne dentrer et de mettre du papier !

33 IFT Méthode retrait pour éviter le blocage public synchronized void retrait(double montant) throws InterruptedException { while(balance < montant) wait(); }

34 IFT Wait et NotifyAll Une tâche qui appelle wait est dans un état bloqué. Elle ne sera pas activée jusquà ce quelle soit débloquée. Elle débloque lorsquune autre tâche appelle notifyAll. Quand une tâche appelle notifyAll, toutes les tâches qui attendent lobjet sont débloquées. Seulement la tâche bloquant lobjet peut appeller notifyAll.

35 IFT Salle de bain wait/notifyAll La tâche appellant wait correspond à la personne qui entre dans la salle de bain et qui réalise quil ny a plus de papier. La personne dans ce cas quitte la salle de bain et attends à lextérieur. Dautres personnes peuvent entrer et sortir mais la première personne attend. Éventuellement, un préposé entre dans la salle de bain, met du papier et informe les autres personnes que le papier a été installé. Toutes les personnes qui attendaient peuvent maintenant compétitioner pour la salle de bain.

36 IFT Allons voir le code de CompteBanqueThreadTest.java …

37 IFT Animation Des animations contiennent différents objets qui bougent et changent dans le temps. La programmation multi-tâches est utile dans ce cas. Un algorithme danimation aide à visualiser les étapes de lexécution dun algorithme (par exemple).

38 IFT Algorithme danimation On exécute avec une tâche séparée la mise à jour dune image reflétant létat courant dexécution dun algorithme. La tâche fait une pause pour que lusager constate le changement. Après un court délai, la tâche se réveille et exécute jusquau prochain point dintérêt. Elle met à jour à nouveau limage et fait une nouvelle pause…

39 IFT Animation du tri par sélection Les éléments des états de lalgorithme sont : oLe tableau des valeurs oLa taille de la région triée oLélément courant Pour visualiser lalgorithme, il faut : oMontrer la partie triée du tableau en utilisant une couleur différente. oMarquer lélément courant avec la couleur rouge.

40 IFT Animation du tri par sélection Ajouter un Applet à la classe de lalgorithme : public class Selection { public Selection(int[] tableau, Applet unApplet) { t = tableau; applet = unApplet; }... private Applet applet; }

41 IFT Animation du tri par sélection Fournir une méthode pause qui permet de dormir une période de temps proportionnelle au nombre détapes requis, une unité de temps pour chaque visite dun élément du tableau. public void pause(int etapes) throws InterruptedException { if(Thread.currentThread().isInterrupted()) throw new InterruptedException(); applet.repaint(); Thread.sleep(etapes * DELAI); }

42 IFT Animation du tri par sélection Ajouter une méthode draw pour dessiner létat courant du tableau : public void draw(Graphics2D g2) { int dX = applet.getWidth() / t.length; for(int i = 0; i < t.length; i++) { if(i == positionCourante) g2.setColor(Color.red); else if(i <= dejaTrie) g2.setColor(Color.blue); else g2.setColor(Color.black); g2.draw(new Line2D.Double(i * dX, 0, i * dX, t[i])); }

43 IFT Animation du tri par sélection Ajouter une pause pour la méthode positionMinimum : public int positionMinimum(int depart) throws InterruptedException { int positionPlusPetite = depart; for(int i = depart + 1; i < t.length; i++) { if(t[i] < t[positionPlusPetite]) positionPlusPetite = i; positionCourante = i; pause(2); } return positionPlusPetite; } Ajouter une pause similaire à la méthode tri.

44 IFT Applet pour le GUI Démarrer lanimation en pressant le bouton de la souris. Si une animation exécute déjà, interrompre la tâche pour la terminer. public class SelectionApplet extends Applet { public SelectionApplet() { class MousePressListener extends MouseAdapter { public void mousePressed(MouseEvent e) { if(animation != null && animation.isAlive()) animation.interrupt(); demarrerAnimation(); } MouseListener auditeur = new MousePressListener(); addMouseListener(auditeur);... animation = null; }... private Thread animation; }

45 IFT Applet pour le GUI La méthode paint de lApplet appelle la méthode draw de lalgorithme. public void paint(Graphics g) { if (tri == null) return; Graphics2D g2 = (Graphics2D)g; tri.draw(g2); }

46 IFT Applet pour le GUI LApplet contient une méthode demarrerAnimation oElle construit un objet Selection, avec un nouveau tableau, qui réfère à lApplet oElle construit une tâche oLa méthode run de la tâche appelle la méthode tri de Selection.

47 IFT Applet pour le GUI demarrerAnimation public void demarrerAnimation() { class AnimationThread extends Thread { public void run() { try { sel.tri(); } catch (InterruptedException exception) { } int[] t = Tableau.tableauAleatoire(30, 300); sel = new Selection(t, this); animation = new AnimationThread(); animation.start(); }

48 IFT Allons voir le code de SelectionApplet.java …


Télécharger ppt "PROGRAMMATION MULTI-TÂCHES (MULTITHREADING). IFT10202 OBJECTIFS Comprendre comment un programme peut être fragmenté et exécuté en parallèle. Apprendre."

Présentations similaires


Annonces Google