Année 2008-2009. Les threads Java. Nicolas Baudru mél : nicolas.baudru@esil.univmed.fr page web : nicolas.baudru.perso.esil.univmed.



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

Synchro et Threads Java TM

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

Notion de thread (1/2)

INITIATION AU LANGAGE JAVA

Threads. Threads. USTL routier 1

Un ordonnanceur stupide

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

Introduction : les processus. Introduction : les threads. Plan

Une introduction à la technologie EJB (2/3)

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

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

Développement Logiciel

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

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

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

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

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

Programmation Objet Java Correction

Projet gestion d'objets dupliqués

Programmation d Applications Concurrentes et Distribuées (INF431)

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

ACTIVITÉ DE PROGRAMMATION

Cours de Systèmes d Exploitation

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

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

Remote Method Invocation Les classes implémentant Serializable

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Les Threads. Sommaire. 1 Les Threads

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Problèmes liés à la concurrence

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Cours Programmation Système

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmer en JAVA. par Tama

RMI le langage Java XII-1 JMF

TP1 : Initiation à Java et Eclipse

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Auto-évaluation Programmation en Java

Chapitre 2. Classes et objets

Programmation Orientée Objet

Remote Method Invocation (RMI)

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

Corrigé des exercices sur les références

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Performances de la programmation multi-thread

Généralités sur le Langage Java et éléments syntaxiques.

Java - la plateforme

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Corrigés des premiers exercices sur les classes

Diagramme de classes

Informatique industrielle A Systèmes temps-réel J.F.Peyre. Partie I : Introduction

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

Langage Java. Classe de première SI

Chapitre 10. Les interfaces Comparable et Comparator 1

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Introduction à la programmation concurrente

Les processus légers : threads. Système L3, /31

Télécom Nancy Année

Initiation à JAVA et à la programmation objet.

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

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

Flux de données Lecture/Ecriture Fichiers

Sixième partie. Programmation multi-activités Java & Posix Threads. Généralités Java Threads POSIX Threads Autres approches

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

Programmation par les Objets en Java

Systeme d'exploitation

Tp 1 correction. Structures de données (IF2)

I-JVM: une machine virtuelle Java pour l isolation de composants dans OSGi

TD2 Programmation concurrentielle

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

Calcul Parallèle. Cours 5 - JAVA RMI

TP1 : Initiation à Java et Eclipse

Java DataBaseConnectivity

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

TD/TP PAC - Programmation n 3

Guide d'utilisation du Serveur USB

Utiliser Java sans BlueJ

Concept de machine virtuelle

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

Java Licence Professionnelle CISII,

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

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

Apprendre Java en 154 minutes

Applet pour visualiser les variables «automate» notifiées

Programmation par composants (1/3) Programmation par composants (2/3)

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

Java 7 Les fondamentaux du langage Java

Application web de gestion de comptes en banques

LOG4430 : Architecture et conception avancée

Cours de Base de Données Cours n.12

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Cours 1: Java et les objets

Introduction aux Systèmes et aux Réseaux

Cours de Génie Logiciel

Transcription:

Année 2008-2009 Les threads Java Nicolas Baudru mél : nicolas.baudru@esil.univmed.fr page web : nicolas.baudru.perso.esil.univmed.fr 1

Présentation du problème Revenons quelques instants à nos animaux. public class Chien { public void aboyer () { // ici se trouve le comportement normal d ' un chien public class TestChien { public static void main ( String [] args ) { Chien c1 = new Chien (); Chien c2 = new Chien (); c1. aboyer (); c2. aboyer (); Les deux chiens aboient-ils en même temps? 2

Multithreading en Java En java, il est possible de simuler l'exécution de plusieurs programmes en même temps. C'est le multithreading. L'exécution de chaque programme est alors appelé un thread. Le multithreading est intégré au langage Java. La création de threads est très simple : Thread t = new Thread (); // créer un nouveau thread t. start (); En créant un nouvel objet Thread, vous créez un l d'exécution séparé qui possède sa propre pile. A votre avis, que fait ce thread? 3

Tâche d'un thread En Java le multithreading signie qu'il faut créer un thread, écrire la tâche exécutée par le thread, lier la tâche au thread. Pour réaliser cela, il faut étudier et comprendre la classe Thread. Thread void join() void start() static void sleep() 4

Que signie avoir plusieurs piles d'appels Avec plusieurs piles d'appels, on a l'impression que plusieurs choses se passent en même temps. Dans un système multiprocesseurs cela serait réellement possible, mais pas sur un système monoprocesseur. Il faut donc faire semblant, ce qui est rendu possible par les threads. A votre avis comment Java peut donner l'impression d'exécuter plusieurs piles d'appels? 5

Exemple public static void main ( String [ ] args ) { // étape 1 Runnable r = new MaTache (); Thread t = new Thread ( r ); t. start (); // étape 2 : une nouvelle pile est créée Chat c = new Chat (); thread principal thread t Etape 1 : main() Etape 2 : main() t.start() run() Etape 3 : main() Chien() run() go() 6

Comment lancer un nouveau thread 1 Créer un objet Runnable (la tâche du thread) : Runnable threadtache = new MonRunnable (); En fait, Runnable est une interface. Il faut donc écrire une classe implémentant cette interface et dénissant la tâche que le thread doit exécuter dans une nouvelle pile. Ici, cette classe est appelée MonRunnable. 2 Créer un objet Thread et lui passer une tâche : Thread monthread = new Thread ( threadtache ); On passe l'objet Runnable au constructeur de Thread. Le thread sait ainsi quelle méthode placer au sommet de la pile : c'est la méthode run() de l'objet Runnable. 3 Lancer le thread : monthread. start (); C'est à ce moment là qu'un nouveau l d'exécution est créé. Une nouvelle pile est créée avec la méthode run() en son sommet. 7

L'interface Runnable L'interface Runnable ne dénit qu'une seule méthode : la méthode void run(). Lorsque vous voulez dénir une tâche, il vous sut d'écrire une classe qui implémente Runnable. Cette classe contient au moins une méthode. Laquelle et pourquoi? Ainsi, lorsque vous fournissez à un constructeur de Thread un objet Runnable, vous lui donnez un moyen d'obtenir une méthode run(). Autrement dit, vous lui donnez du travail à faire. 8

Exemple public class MonRunnable implements Runnable { public void run () { go (); public void go () { // faire des choses class TestThread { public static void main ( String [] args ) { Runnable tache = new MonRunnable (); Thread monthread = new Thread ( tache ); monthread. start (); // d ' autres trucs à faire... 9

Etats des threads 1 le thread est nouveau. L'objet est créé mais il n'y a pas encore de l d'exécution. Thread t = new Thread ( r ); 2 le thread est exécutable. Quand vous lancez le thread, une pile est créée. Le thread attend alors que la JVM le choisisse an de s'exécuter. t. start ; 3 le thread est en cours d'exécution. C'est LE thread qui s'exécute, le seul. C'est l'ordonnanceur de la JVM qui décide quel thread va s'exécuter à un moment donné. Quand un thread s'exécute les autres sont en attente. A tout moment l'ordonnanceur peut arrêter l'exécution du thread (il retourne alors dans l'état exécutable) et en choisir un autre. 4 le thread est bloqué. Le thread veut obtenir une ressource (une méthode d'un objet verrouillé, le clavier,...) non disponible pour le moment. ex : t. sleep (200); 10

Etats des threads t5,t7,t1,t4 nouveau exécutable t3,t6 bloqué en cours d'exécution t2 un seul processus ici fin 11

Questions Quel est le résultat du programme suivant? public class MonRunnable implements Runnable { public void run () { go (); public void go () { System. out. println (" monthread " ); class TestThread { public static void main ( String [] args ) { Runnable tache = new MonRunnable (); Thread monthread = new Thread ( tache ); monthread. start (); System. out. println (" retour à main () " ); Peut-on ressusciter un thread mort (i.e. qui a terminé son exécution)? 12

Endormir un thread La méthode statique sleep(int d) de la classe Thread force le thread en cours d'exécution à passer dans l'état bloqué pendant d ms. L'ordonnanceur choisira alors un autre thread dans la liste des threads exécutables. public class MonRunnable implements Runnable { public void run () { go (); public void go () { try { Thread. sleep (2000); catch ( InterruptedException ex ) { ex. printstacktrace (); // faire d ' autres trucs Au bout de combien de temps un thread bloqué par un appel à sleep va-t-il retrouver son état en cours d'exécution? 13

Encore un exemple public class MaTache implements Runnable { public void run () { for ( int i = 0; i < 25; i ++) { String nom = Thread. currentthread (). getname (); System. out. println ( nom + " est en cours d ' exécution " ); public static void main ( String [] args ) { Runnable tache = new MaTache (); Thread a = new Thread ( tache ); a. setname (" Caroline " ); Thread b = new Thread ( tache ); b. setname (" Cedric " ); a. start (); b. start (); Quel est le résultat? 14

Le problème de l'accès concurrent Une situation où deux processus ou plus lisent ou écrivent des données partagées et où le résultat nal dépend de quel élément s'exécute à un moment donnée est appelée le problème de l'accès concurrent. Exemple : voir complément de cours Il est très dicile de déboguer des programmes contenant des problèmes de concurrence, car les résultats des tests sont souvent corrects à première vue, mais de temps en temps il se produit des situations curieuses et inexpliquées. 15

Exclusion mutuelle et sections critiques Pour éviter les problèmes de ce type de problème, il faut trouver une solution pour interdire que plusieurs threads lisent et écrivent des données partagées simultanément. L'exclusion mutuelle est une méthode qui permet de s'assurer que si un thread utilise une variable ou un chier partagés, les autres processus seront excluent de la même activité. Les choix de la mise en oeuvre de l'exclusion mutuelle est une question de conception majeure pour tout système d'exploitation. Leur étude sort de la portée de ce cours. Dans un programme, la partie à partir de laquelle on accède à une ressource partagée se nomme section critique. Pour éviter les problèmes d'accès concurrent, il faut empêcher que deux processus se retrouvent simultanément dans leurs sections critiques. 16

L'exclusion mutuelle en Java : les vérrous En Java, il est très simple d'empêcher que deux threads exécutent en même temps une même méthode. Pour cela, il sut d'utiliser le modicateur synchronized sur la méthode en question. Le mot clé synchronized signie qu'un thread a besoin d'une clé pour accéder au code synchronisé. Pour protéger vos données, vous devez donc protéger les méthodes qui ont une action sur ces données. 17

Les vérrous et les objets Tout objet possède un vérrou, et ce vérrou n'a qu'une clé. Lorsqu'un thread veut entrer dans une méthode synchronisée, il doit obtenir la clé de l'objet. Si la clé est disponible, i.e. aucun autre thread ne la détient, le thread prend la clé et entre dans la méthode. Dès lors le thread gardera la clé tant qu'il n'aura pas terminé la méthode synchronisée. Si la clé de l'objet n'est pas disponible, aucun thread ne peut entrer dans une méthode synchronisée de cet objet. Pourquoi ne pas tout synchroniser? 18

Exemple sans synchronized class TestSync implements Runnable { private int solde ; public void run () { for ( int i = 0; i < 50; i ++) { incrementer (); System. out. println (" le solde est de : " + solde ); public void incrementer () { int i = solde ; solde = i + 1; public class TestTestSync { public static void main ( String [] args ) { TestSync tache = new TestSync (); Thread a = new Thread ( tache ); Thread b = new Thread ( tache ); a. start (); b. start (); 19

Exemple avec synchronized class TestSync implements Runnable { private int solde ; public void run () { for ( int i = 0; i < 50; i ++) { incrementer (); System. out. println (" le solde est de : " + solde ); public synchronized void incrementer () { int i = solde ; solde = i + 1; public class TestTestSync { public static void main ( String [] args ) { TestSync tache = new TestSync (); Thread a = new Thread ( tache ); Thread b = new Thread ( tache ); a. start (); b. start (); 20

synchronisation des threads et deadlock voir complément de cours. 21