Chapitre 1. Programmation multitâches avec les threads

Documents pareils
Un ordonnanceur stupide

Synchro et Threads Java TM

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Threads. Threads. USTL routier 1

INITIATION AU LANGAGE JAVA

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

Programmer en JAVA. par Tama

Introduction : les processus. Introduction : les threads. Plan

Objets et Programmation. origine des langages orientés-objet

Projet de programmation (IK3) : TP n 1 Correction

Support de cours Java

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Programmation avec des objets : Cours 7. Menu du jour

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Premiers Pas en Programmation Objet : les Classes et les Objets

Notion de thread (1/2)

Programme Compte bancaire (code)

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Auto-évaluation Programmation en Java

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Corrigé des exercices sur les références

TD3: tableaux avancées, première classe et chaînes

Package Java.util Classe générique

Programmation Par Objets

Programmation Objet Java Correction

Une introduction à la technologie EJB (2/3)

Développement Logiciel

On appelle variable condition une var qui peut être testée et

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

TP1 : Initiation à Java et Eclipse

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Exercices INF5171 : série #3 (Automne 2012)

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Plan du cours. Historique du langage Nouveautés de Java 7

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Programmation par les Objets en Java

Une introduction à Java

TD2 Programmation concurrentielle

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Java Licence Professionnelle CISII,

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Dis papa, c est quoi un bus logiciel réparti?

as Architecture des Systèmes d Information

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Gestion distribuée (par sockets) de banque en Java

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Introduction à la programmation concurrente

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Chapitre 10. Les interfaces Comparable et Comparator 1

RMI le langage Java XII-1 JMF

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

La JVM. La machine virtuelle Java. La JVM. La JVM

Langage Java. Classe de première SI

Problèmes liés à la concurrence

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Java - la plateforme

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Modèle à composants. Daniel Hagimont. IRIT/ENSEEIHT 2 rue Charles Camichel - BP TOULOUSE CEDEX 7. Remerciements

La carte à puce. Jean-Philippe Babau

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Remote Method Invocation (RMI)

PIGOURIER Vincent ANNEE SPECIALE 99/00 RAPPORT DE PROJET : LES THREADS JAVA. Responsable : Serge Rouveyrol

Programmation Internet en Java

Programmation en Java IUT GEII (MC-II1) 1

F. Barthélemy. 17 mai 2005

Création d une application JEE

Remote Method Invocation en Java (RMI)

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Initiation à JAVA et à la programmation objet.

Héritage presque multiple en Java (1/2)

Remote Method Invocation Les classes implémentant Serializable

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Utiliser Java sans BlueJ

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Introduction au langage Java

Web Tier : déploiement de servlets

SugarCubes. Jean-Ferdinand Susini Maître de Conférences, CNAM Chaire systèmes enfouis et embarqués. Paris, le 9 janvier, 2009

Java 1.5 : principales nouveautés

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Flux de données Lecture/Ecriture Fichiers

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Programmation concurrente et Java. Les Threads en Java : une première approche

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Cours de Systèmes d Exploitation

Java Licence Professionnelle CISII,

2. Comprendre les définitions de classes

Calcul Parallèle. Cours 5 - JAVA RMI

Environnements de développement (intégrés)

INF 321 : mémento de la syntaxe de Java

Java DataBaseConnectivity

Transcription:

Chapitre 1. Programmation multitâches avec les threads 1. Programmation multitâche Tous les systèmes d exploitation actuels ont la possibilité d effectuer plusieurs tâches en simultané. Toute l informatique d aujourd hui utilise ce principe essentiel à la réalisation de tâches complexes tel que le fenêtrage de Windows par exemple. En effet, lorsqu un utilisateur consulte un site internet, l ordinateur effectue plusieurs tâches en même temps, comme gérer la communication internet, analyser le contenu reçu et gérer l arrivée permanente de données. Donc, chaque processus exécuté sur la machine est plus ou moins indépendant des autres. On distingue deux types de programmes multitâches. Le multitâche dit préemptif et le multitâche dit coopératif. Le premier est un programme dont l exécution est contrôlée par le système d exploitation qui peut choisir de le stopper à tout moment sans attendre une autorisation de sa part. Le second peut être interrompu uniquement s il l autorise. 2. Threads et processus Il existe une différence entre les threads et les processus. Un processus est un programme s exécutant de manière indépendant des autres processus. Il possède une copie unique de ses propres variables. Le thread, lui, partage les données avec les autres threads. Cela peut paraître dangereux dans un premier temps mais il s avère que cette possibilité les rend plus rapides et plus faciles à gérer que les processus. En effet, il est bien plus rapide de créer et de détruire les threads individuels que de créer de processus. 3. Définition d un thread Il s agit d un programme s exécutant en même temps que d autres programmes. Il est capable de se mettre en sommeil pour permettre aux autres threads d avoir une chance d être exécuter. La période de sommeil est fixée par lui et le programmeur aura à charge de donner une valeur raisonnable de ce temps, pour permettre aux autres threads de pouvoir s exécuter. Exemple : un navigateur internet 4. L objet thread de java Tout d abord, lorsqu on souhaite qu une classe puisse se comporter comme un thread, il faut que : ESSTT Achraf Othman www.achrafothman.net Page 6

Cette classe implémente l interface Runnable, surcharge la méthode run et contient un champ de type Thread. Ou bien Cette classe hérite de la classe Thread La deuxième solution s avère irréaliste étant donné que la plupart du temps, vos propres classes hériteront déjà 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. Voici un digramme objet représentant le cas de figure le plus courant où l objet devant s exécuter comme un thread implémente l interface Runnable et hérite de sa classe parent. Interface ParentClass Runnable Champs Méthodes est un ThreadedClass +run() implémente Le code Java pour ce modèle pourrait être le suivant : public class ThreadedClass extends ParentClass implements Runnable Thread th; public ThreadedClass () th = new Thread(this); th.start(); public void run () th.sleep(100); 5. 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. -th : Thread Champs +run() :void Méthodes ESSTT Achraf Othman www.achrafothman.net Page 7

4. Pour passer en mode «non exécutable» (non runnable), il faut qu une des trois conditions suivantes soit remplie : un appel de la méthode «sleep(int)» un appel de la méthode wait() un accès I/O bloqué. 5. Pour revenir en mode exécutable selon la raison qui les a rendus non exécutables : sleep : le nombre de milliseconde de sommeil est terminé. wait : l objet après qui le thread attend, effectue un appel de la méthode «notify» ou «notifyall». I/O bloqué : l opération d I/O est terminé. 6. Pour mourir, un thread doit terminer sa méthode «run» ou propager une exception hors de celle-ci. 6. Planification d un thread La plupart des systèmes d exploitation permettent la programmation multithread, mais tous ne le font pas de la même façon. En effet, java pour Solaris ne permet pas à deux threads de priorité égale de se battre pour le contrôle, c est alors au programmeur de gérer les passages de mains entre des threads de priorité égales. Microsoft Windows par contre permettent ce genre de processus. On ne peut donc pas se fier sur l exploitation de priorités pour assurer l exécution ou l attente d une tâche. La priorité d un thread est un nombre qui lui est assigné et qui permet d identifier la part de ressource de traitement auquel il aura droit dans un système découpant le temps ou quel thread sera en exécution dans un système de préemption. La priorité s étend en JAVA de MIN_PRIORITY (1) à MAX_PRIORITY(10). Si des nombres trop grands ou trop petits sont envoyés, une IllegalArgumentException est lancée par la méthode setpriority.. La méthode yield permet à un thread de passer la main. Sur une plate-forme qui découpe le temps, cela permet de ralentir un thread et libérer des ressources de traitement. Dans un ESSTT Achraf Othman www.achrafothman.net Page 8

système fonctionnant par préemption, cela peut permettre à un thread de priorité égale d effectuer son traitement. On utilise particulièrement cette méthode pour rendre un code plus portable, lorsque l exécution d un thread de priorité égale doit se faire absolument de façon simultanée. La méthode join() permet d attendre la mort d un thread avant de continuer le traitement. Le thread à partir duquel la méthode a été appelée est celui qui doit mourir pour que le traitement continue. Voyons maintenant le tout dans deux petits exemples. Le premier CHorlogerie étend la classe Thread. Cinq threads sont créés et démarrés. Ensuite, le thread principal (celui du départ qui exécute le «main») attend la mort du thread no 4 ( T[4].join() ). public class CHorlogerie /* CHorlogerie.java */ public static void main (String Arg []) throws InterruptedException System.out.println ("MIN: " + Thread.MIN_PRIORITY); System.out.println ("MAX: " + Thread.MAX_PRIORITY); CChrono T[] = new CChrono [5]; T[0] = new CChrono (9, "Tortue"); T[1] = new CChrono (6, "Poisson"); T[2] = new CChrono (3, "Chat"); T[3] = new CChrono (2, "Tigre"); T[4] = new CChrono (1, "Sangoku"); System.out.println (T[x].getName() + " status : " + T[x].isAlive()); T[x].start(); System.out.println (T[x].getName() + " status : " + T[x].isAlive()); T[4].join(); System.out.println ("----------------------"); T[x].Arret(); class CChrono extends Thread /* CChrono.java */ private int Attente; private int Compte; private boolean Continuer; public CChrono (int Vitesse, String Nom) super (Nom); setpriority (1); if (Math.abs(Vitesse) > 10) Vitesse = 10; Attente = Math.abs (Vitesse) * 1000; Compte = 0; Continuer = true; public void run () while (Continuer && Compte < 10) ESSTT Achraf Othman www.achrafothman.net Page 9

System.out.println (getname() + " : " + Compte); Compte ++; long T = System.currentTimeMillis(); while (System.currentTimeMillis() - T < Attente); System.out.println (getname() + " est mort *********"); public void Arret () Continuer = false; Exécution : MIN: 1 MAX: 10 Tortue status : false Poisson status : false Chat status : false Tigre status : false Sangoku status : false Tortue status : true Poisson status : true Chat status : true Tigre status : true Sangoku : 0 Chat : 0 Tortue : 0 Tigre : 0 Poisson : 0 Sangoku status : true Sangoku : 1 Tigre : 1 Sangoku : 2 Chat : 1 Sangoku : 3 Tigre : 2 Sangoku : 4 Sangoku : 5 Poisson : 1 Chat : 2 Tigre : 3 Sangoku : 6 Sangoku : 7 Tigre : 4 Sangoku : 8 Tortue : 1 Chat : 3 Sangoku : 9 Tigre : 5 Sangoku est mort ********* ---------------------- Poisson est mort ********* Chat est mort ********* Tigre est mort ********* Tortue est mort ********* Cette méthode a l avantage d être simple, mais a le désavantage que la classe contenant la méthode run doit hériter de la classe Thread. Comme l héritage multiple n existe pas, comment procéder si on ne veut pas que la classe hérite de Thread? C est alors que l on utilise la deuxième méthode. ESSTT Achraf Othman www.achrafothman.net Page 10

La seconde méthode consiste à implémenter l interface Runnable. Ensuite, on se construit un thread et on connecte l objet dessus. L interface Runnable, force la définition dans la classe d une méthode : public void run() Il suffit donc de construire un thread et de lui envoyer l objet de type Runnable voulu en paramètre. Lorsque la méthode start de ce thread sera appelée, c est la méthode run de l objet Runnable reçu qui sera exécuté. Pour simplifier l utilisation et uniformiser, il est conseiller d ajouter des méthodes telles join, isalive, start, etc. à la classe Runnable pour l utiliser comme un objet de type Thread. Voyez l exemple suivant qui démontre cette méthode : public class CHorlogerie2 /* CHorlogerie2.java */ public static void main (String Arg []) throws InterruptedException System.out.println ("MIN: " + Thread.MIN_PRIORITY); System.out.println ("MAX: " + Thread.MAX_PRIORITY); CChronoRunnable T[] = new CChronoRunnable [5]; T[0] = new CChronoRunnable (9, "Tortue"); T[1] = new CChronoRunnable (6, "Poisson"); T[2] = new CChronoRunnable (3, "Chat"); T[3] = new CChronoRunnable (2, "Tigre"); T[4] = new CChronoRunnable (1, "Sangoku"); System.out.println (T[x].getName() + " status : " + T[x].isAlive()); T[x].start(); System.out.println (T[x].getName() + " status : " + T[x].isAlive()); T[4].join(); System.out.println ("----------------------"); T[x].Arret(); class CChronoRunnable implements Runnable private int Attente; private int Compte; private boolean Continuer; private Thread Moteur; public CChronoRunnable (int Vitesse, String N) Moteur = new Thread (this, N); Moteur.setPriority (1); if (Math.abs(Vitesse) > 10) Vitesse = 10; Attente = Math.abs (Vitesse) * 1000; Compte = 0; Continuer = true; public void run () while (Continuer && Compte < 10) System.out.println (getname() + " : " + Compte); Compte ++; long T = System.currentTimeMillis(); ESSTT Achraf Othman www.achrafothman.net Page 11

while (System.currentTimeMillis() - T < Attente); System.out.println (getname() + " est mort *********"); public void Arret () Continuer = false ; public String getname() return Moteur.getName(); public void start() Moteur.start(); public Boolean isalive() return Moteur.isAlive(); public void join() throws InterruptedException Moteur.join(); Travail demandé : Envoyer par email l exécution du programme. 7. Les groupes de threads Les groupes de thread sont des ensembles de thread. De plus, les groupes de thread peuvent contenir d autres groupes de threads et ainsi former un arbre. Les threads d un groupe peuvent recueillir de l information sur les threads du même groupe mais pas des threads du groupe parent ou de tout autre groupe. Il est cependant possible d accéder au groupe père avec la méthode getparent. L avantage des groupes de thread c est qu ils permettent de regrouper ensembles des threads qui travaillent ensemble. Sans cette méthode, il faudra se donner des accès parfois difficiles aux autres threads par des membres et des paramètres. 8. Résumé sur les méthodes Il s agit de méthodes statiques qui doivent être appelées directement sur la classe Thread. La méthode currentthread : renvoie l objet Thread qui correspond au fil de l exécution. La méthode yield : a pour effet d amener l interpréteur à changer de contexte en passant du fil en cours d exécution au prochain fil prêt à s exécuter. C est un des moyens qui permettent de s assurer que les fils de priorité moins élevée ont la chance de s exécuter. La méthode sleep(int n) : oblige l interpréteur de faire dormir le fil d exécution durant n milliseconde. Une fois ce temps écoulé, le fil est de nouveau prêt à s exécuter. La méthode start ; la méthode start demande à l interpréteur java de créer un contexte de fils dans le système et de commencer à l exécuter. Ensuite, la méthode run de ce fils est appelée dans le contexte du nouveau fils. Un seul appel est autorisé. La méthode run : constitue le corps d un fil en exécution. Il s agit de la seule méthode de l interface Runnable. Elle est appelée par la méthode start après l initialisation du fil approprié. ESSTT Achraf Othman www.achrafothman.net Page 12

La méthode stop : a pour effet d arrêter immédiatement le fil en cours d exécution. C est souvent une façon abrupte de mettre fin à un fil. La méthode setpriority(int p) : établit la priorité d un fil d après la valeur en nombre entier qui lui est transmise. La méthode setname(string name) : donne au fil un nom compréhensible, ce qui facilite la tâche de débogage dans les programmes. ESSTT Achraf Othman www.achrafothman.net Page 13