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



Documents pareils
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

Synchro et Threads Java TM

Threads. Threads. USTL routier 1

Introduction : les processus. Introduction : les threads. Plan

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

Un ordonnanceur stupide

Cours de Systèmes d Exploitation

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

INITIATION AU LANGAGE JAVA

Introduction à la programmation concurrente

Notion de thread (1/2)

Problèmes liés à la concurrence

Projet gestion d'objets dupliqués

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

TD2 Programmation concurrentielle

Programmation d Applications Concurrentes et Distribuées (INF431)

Une introduction à la technologie EJB (2/3)

Remote Method Invocation Les classes implémentant Serializable

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

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

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

Projet de programmation (IK3) : TP n 1 Correction

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Calcul Parallèle. Cours 5 - JAVA RMI

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

Auto-évaluation Programmation en Java

LOG4430 : Architecture et conception avancée

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

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

Support de cours Java

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Cours de Base de Données Cours n.12

Cours Bases de données 2ème année IUT

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

Programmation Objet Java Correction

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

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

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

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

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Performances de la programmation multi-thread

Développement Logiciel

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

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

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Introduction aux systèmes temps réel. Iulian Ober IRIT

Les Threads. Sommaire. 1 Les Threads

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

Cours 2: Exclusion Mutuelle entre processus (lourds, ou légers -- threads)

Introduction aux Systèmes et aux Réseaux

Bases de données et sites WEB Licence d informatique LI345

Cours Programmation Système

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

TP1 : Initiation à Java et Eclipse

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

Programmer en JAVA. par Tama

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

TP, première séquence d exercices.

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

Premiers Pas en Programmation Objet : les Classes et les Objets

INTRODUCTION À LA PROGRAMMATION CONCURRENTE

Initiation à JAVA et à la programmation objet.

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

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

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

Java - la plateforme

Corrigé des exercices sur les références

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Chapitre 10. Les interfaces Comparable et Comparator 1

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

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

as Architecture des Systèmes d Information

Cours de Génie Logiciel

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

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

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

Certificat Big Data - Master MAthématiques

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

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

Introduction à la Programmation Parallèle: MPI

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

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

Bases Java - Eclipse / Netbeans

Remote Method Invocation (RMI)

La technologie Java Card TM

Android UIThread, Thread, Handler et AsyncTask

2. Comprendre les définitions de classes

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

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

Java Licence Professionnelle CISII,

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

Java Licence Professionnelle CISII,

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

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

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Interfaces graphiques avec l API Swing

Réplication des données

Conventions d écriture et outils de mise au point

Transcription:

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation Cycle Ingénierie 2e année SIGL Dernière mise à jour : 19/10/2006 Christophe Porteneuve

Threads Principes Cycle de vie Création java.lang.thread java.lang.runnable Synchronisation 2/22

Threads Principes Un thread est comme un programme dans le programme On peut avoir plusieurs threads pour un seul programme Les threads s exécutent «en parallèle» Les threads et les données Un champ peut être «partagé» par plusieurs threads, ou Chaque thread peut avoir sa propre «version» du champ Les threads et le code Il est parfois nécessaire d empêcher que certaines méthodes soient exécutées simultanément par différents threads, pour éviter des résultats incohérents L exécution en parallèle peut poser certains problèmes, ex. attente mutuelle (deadlocks). D où plus de réflexion en amont 3/22

Threads Cycle de vie Un thread a le cycle de vie suivant : Nouveau thread start En cours yield Runnable sleep / wait / blocage E/S fin de sleep / notify / interrupt Vivant (isalive() == true) Non Runnable / Suspendu Mort la méthode run() se termine 4/22

Threads Création Il existe deux manières de créer des threads Extension de java.lang.thread Utile si on va créer plusieurs threads similaires, éventuellement paramétrés différemment Utile si on veut enrichir les capacités des objets threads avec des méthodes publiques supplémentaires, etc. Implémentation de java.lang.runnable Pratique pour des classes thread anonymes, donc des implémentations ponctuelles et simples Pratique aussi pour ajouter la capacité à être threadé sur une classe existante 5/22

Threads java.lang.thread (1/2) La classe java.lang.thread contient notamment : De nombreux constructeurs, mais essentiellement : Un vide (classe contenant le code à exécuter, threads anonymes) Un prenant un argument de nom pour différenciers les threads Un prenant un objet auquel déléguer le code à exécuter Un prenant deux arguments : le nom et un objet délégué currentthread(), statique, pour connaître le thread courant Des méthodes de gestion du cycle de vie (ex. isalive()) Des méthodes de synchronisation spécifiques (ex. join()) 6/22

Threads java.lang.thread (2/2) public class MyThread extends Thread { public MyThread(final String name) { super(name); public void run() { // le code effectif est ici public class MyApp { public static void main(final String[] args) { new MyThread("Toto").start(); 7/22

Threads java.lang.runnable (1/2) L interface java.lang.runnable a une seule méthode : public interface Runnable { public void run(); Cette méthode contient simplement le code a exécuter Un objet implémentant Runnable est passé en argument à un objet Thread à la construction code délégué 8/22

Threads java.lang.runnable (2/2) public class RunnablePrimeCruncher extends PrimeCruncher implements Runnable { public void run() { crunchprime(); Ici, on suppose qu il existait une classe de calculs sur nombres premiers, PrimeCruncher, dont la méthode de travail serait crunchprime(). Pour pouvoir lancer cela dans un thread, on en fait une variante implémentant Runnable et donc run(). public class MyApp { public static void main(final String[] args) { final RunnablePrimeCruncher cruncher = new RunnablePrimeCruncher(1000); new MyThread("Cronch", cruncher).start(); 9/22

Threads Endormissement, pause légère Un thread peut décider de «s endormir» un moment. Pendant ce temps, il est toujours considéré en vie (alive) mais pas running : dans son cycle de vie, il est not runnable. On utilise sleep(long millis) Un thread peut aussi décider de «laisser le passage» à d autres threads, (très) temporairement. Pendant ce temps, il est néanmoins considéré running. On utilise yield() La JVM décide du temps de pause en fonction des charges et priorités respectives des autres threads actifs. Evitez de l utilisez à tout bout de champ : cela affecterait négativement les performances. 10/22

Threads Synchronisation (1/8) Lorsque plusieurs threads s exécutent en parallèle, un thread risque de vouloir accéder (en lecture ou écriture) à une donnée alors qu un autre thread y accède en écriture vouloir exécuter une méthode «à exécution unique» (par exemple, qui utilise une ressource exclusive, telle qu un flux sur fichier/socket) alors qu un autre thread est déjà en train de l exécuter Si plusieurs threads collaborent pour résoudre un problème qui a été divisé en sous-parties, ils ont souvent besoin de s attendre Ex. tri réparti (tri rapide, poids équivalents en tri topologique ) 11/22

Threads Synchronisation (2/8) On peut synchroniser l exécution de plusieurs threads En demandant à un thread A d attendre une notification d un thread B En lui demandant d attendre la terminaison d un thread B En protégeant une ressource/méthode contre des accès simultanés Moniteurs Chaque objet Java dispose en interne d un «moniteur», un verrou pour l exclusion mutuelle : tant qu un thread le détient, tout autre tentant de l obtenir va bloquer jusqu à la libération. Passer en attente (wait()) libère atomiquement le verrou Se faire notifier ou interrompre récupère atomiquement le verrou, si on l avait avant mise en attente ou E/S interruptible. 12/22

Threads Synchronisation (3/8) Exemple de «race condition» sur un accès à un champ : public class ParallelSorter implements Runnable { private static int _swapcount = 0; public void run() { // Algorithme de tri, et dedans : _swapcount++; // // run Imaginons un tri rapide qui lance de nouveaux threads pour chaque tri récursif sur les deux partitions Rien ne dit que n threads ne vont pas tenter de modifier _swapcount au même moment. Voyons un schéma 13/22

Threads Synchronisation (4/8) _swapcount T1 T2 T3 T4 T5 T6 T7 0 1 2 Résultat correct : 14 3 4 5 6 7 8 9 10 11 14/22

Threads Synchronisation (5/8) Comment synchroniser l accès simplement : public class ParallelSorter implements Runnable { private static final Object _scmonitor = new Object(); private static int _swapcount = 0; public void run() { // Algorithme de tri, et dedans : synchronized (_scmonitor) { _swapcount++; // // run Il s agit d un bloc synchronisé, qui repose sur le verrou de la référence privée _scmonitor. 15/22

Threads Synchronisation (6/8) _swapcount T1 T2 T3 T4 T5 T6 T7 0 1 2 Résultat correct! 3 4 5 6 7,8 9 10 11, 12 13, 14 attend 16/22

Threads Synchronisation (7/8) On peut aussi «verrouiller» toute une méthode : public final class BankAccount { public synchronized void withdraw(final double amount) { _balance -= amount; // withdraw Dans un tel cas, c est le verrou de l objet conteneur qui est utilisé. Cette approche est simple mais parfois vulnérable : Un «code malicieux» pourrait acquérir dans un thread concurrent le moniteur de votre objet et ne jamais le relâcher, empêchant vos méthodes synchronisées de s exécuter. 17/22

Threads Synchronisation (8/8) Quelques détails supplémentaires sur les moniteurs Dans la terminologie Java, «verrou» (lock) et «moniteur» (monitor) sont interchangeables. Un verrou est acquis par le thread, ce qui veut dire qu au sein d un même thread, une chaîne d appels (call stack) contenant plusieurs méthodes/blocs synchronisés d après le même verrou ne bloquera pas. 18/22