au coeur de java2-%5b%5d

868
Cay S. Horstmann et Gary Cornell Au cœur de Java 2 volume 2 Fonctions avancées Livre Java.book Page I Mardi, 10. mai 2005 7:33 07

Upload: neda-rwn

Post on 23-Oct-2015

110 views

Category:

Documents


4 download

TRANSCRIPT

  • Cay S. Horstmannet Gary Cornell

    Au cur de Java 2volume 2

    Fonctions avances

    Livre Java.book Page I Mardi, 10. mai 2005 7:33 07

  • CampusPress a apport le plus grand soin la ralisation de ce livre afin de vous fournir une infor-mation complte et fiable. Cependant, CampusPress nassume de responsabilits, ni pour son utili-sation, ni pour les contrefaons de brevets ou atteintes aux droits de tierces personnes qui pourraientrsulter de cette utilisation.

    Les exemples ou les programmes prsents dans cet ouvrage sont fournis pour illustrer les descrip-tions thoriques. Ils ne sont en aucun cas destins une utilisation commerciale ou professionnelle.

    CampusPress ne pourra en aucun cas tre tenu pour responsable des prjudices ou dommages dequelque nature que ce soit pouvant rsulter de lutilisation de ces exemples ou programmes.

    Tous les noms de produits ou marques cits dans ce livre sont des marques dposes par leurspropritaires respectifs.

    Aucune reprsentation ou reproduction, mme partielle, autre que celles prvues larticle L. 122-5 2 et 3 a) du code de laproprit intellectuelle ne peut tre faite sans lautorisation expresse de Pearson Education France ou, le cas chant, sans lerespect des modalits prvues larticle L. 122-10 dudit code.

    Publi par CampusPress47 bis, rue des Vinaigriers75010 PARISTl. : 01 72 74 90 00

    Mise en pages : TyPAO

    ISBN : 2-7440-1962-3Copyright 2005 CampusPressTous droits rservs

    CampusPress est une marque de Pearson Education France

    Titre original : Core Java 2, volume 2 - Avanced Features

    Traduit de lamricain par :Marie-Ccile Baland et Nathalie Le Guillou de Penanros

    ISBN original : 0-13-111826-9Copyright 2005 Sun Microsystems, Inc.Tous droits rservs

    Sun Microsystems Inc.4150 Network Circle, Santa Clara, 95054 Californie, USA

    Livre Java.book Page II Mardi, 10. mai 2005 7:33 07

  • Table des matires

    Introduction. Quelques mots au lecteur ..................................................................................... 1A propos de ce livre ................................................................................................................. 1Conventions ............................................................................................................................. 3

    Chapitre 1. Multithreads ........................................................................................................... 5Quest-ce quun thread ? .......................................................................................................... 6

    Utiliser des threads pour laisser une chance aux autres tches .......................................... 11Interrompre des threads ........................................................................................................... 17

    Les tats dun thread .......................................................................................................... 20Threads morts ..................................................................................................................... 23

    Proprits dun thread .............................................................................................................. 24Priorits dun thread ........................................................................................................... 24Threads dmons ................................................................................................................. 25Groupes de threads ............................................................................................................. 25Gestionnaire dexceptions non rcupres ......................................................................... 27

    Synchronisation ....................................................................................................................... 28Exemple de condition de course ........................................................................................ 28Explication des conditions de course ................................................................................ 32Verrous dobjet ................................................................................................................... 33Objets de condition ............................................................................................................ 36Le mot cl synchronized .................................................................................................... 41Blocs synchroniss ............................................................................................................. 47Verrous morts ..................................................................................................................... 48Equit ................................................................................................................................. 50

    Pourquoi les mthodes stop et suspend ne sont plus utilises ................................................. 50Queues de blocage ................................................................................................................... 52Collections compatibles avec les threads ................................................................................. 58

    CopyOnWriteArray ............................................................................................................ 58Callable et Future ..................................................................................................................... 59

    Livre Java.book Page III Mardi, 10. mai 2005 7:33 07

  • IV Table des matires

    Executors ................................................................................................................................. 63Pools de threads ................................................................................................................. 63Excution programme ...................................................................................................... 67

    Synchronizers .......................................................................................................................... 68Barrires ............................................................................................................................. 69Verrous Countdown ............................................................................................................ 69Exchanger ........................................................................................................................... 70Queues synchrones ............................................................................................................. 70Smaphores ........................................................................................................................ 70

    Chapitre 2. Collections ............................................................................................................... 77Les interfaces de collection ..................................................................................................... 78

    Sparer les interfaces dune collection et leur implmentation ......................................... 78Interfaces de collection et ditration dans la bibliothque Java ........................................ 80Suppression dlments ...................................................................................................... 83Mthodes utilitaires gnriques ......................................................................................... 83

    Les collections concrtes ......................................................................................................... 85Listes chanes ................................................................................................................... 86Listes de tableaux ............................................................................................................... 94Tables de hachage .............................................................................................................. 95Arbres ................................................................................................................................. 98Queues de priorit .............................................................................................................. 104Cartes ................................................................................................................................. 105Classes de cartes et de set spcialises ............................................................................... 109

    La structure des collections ..................................................................................................... 114Les vues et les emballages ................................................................................................. 117Les oprations de masse ..................................................................................................... 123Conversion entre collections et tableaux ............................................................................ 124Extension du cadre ............................................................................................................. 125

    Algorithmes ............................................................................................................................. 127Trier et mlanger ................................................................................................................ 129Recherche binaire ............................................................................................................... 131Algorithmes simples .......................................................................................................... 132Ecrire vos propres algorithmes ........................................................................................... 133

    Les anciennes collections ........................................................................................................ 135La classe Hashtable ............................................................................................................ 135Les numrations ............................................................................................................... 135Ensembles de proprits ..................................................................................................... 136Piles .................................................................................................................................... 137Les ensembles de bits ......................................................................................................... 137

    Livre Java.book Page IV Mardi, 10. mai 2005 7:33 07

  • Table des matires V

    Chapitre 3. Programmation des bases de donnes .................................................................. 143Conception de JDBC .......................................................................................................... 144Types de pilotes JDBC ....................................................................................................... 146Applications typiques de JDBC ......................................................................................... 147

    SQL .......................................................................................................................................... 148Installation de JDBC ................................................................................................................ 153Principaux concepts de programmation JDBC ........................................................................ 154

    URL de bases de donnes .................................................................................................. 154Etablir une connexion ........................................................................................................ 154Excuter des commandes SQL .......................................................................................... 159Types SQL avancs ............................................................................................................ 161Gestion des connexions, instructions et jeux de rsultats .................................................. 163Remplir une base de donnes ............................................................................................. 164

    Excution de requtes .............................................................................................................. 168Instructions prpares ........................................................................................................ 168

    Ensembles de rsultats dfilants et actualisables ..................................................................... 177Ensembles de rsultats dfilants ......................................................................................... 178Ensembles de rsultats actualisables .................................................................................. 180

    Mtadonnes ............................................................................................................................ 184RowSet ..................................................................................................................................... 194

    CachedRowSet ................................................................................................................... 194Transactions ............................................................................................................................. 202

    Points de sauvegarde .......................................................................................................... 203Mises jour automatises .................................................................................................. 204

    Gestion avance des connexions .............................................................................................. 206Introduction au LDAP ............................................................................................................. 207

    Configurer un serveur LDAP ............................................................................................. 208Accder aux informations du rpertoire LDAP ................................................................. 212

    Chapitre 4. Objets distribus ..................................................................................................... 223Les rles du client et du serveur ......................................................................................... 224

    Invocations de mthodes distantes ........................................................................................... 227Stubs et encodage des paramtres ...................................................................................... 227Charger des classes dynamiquement .................................................................................. 229

    Etablissement dune invocation de mthode distante .............................................................. 230Interfaces et implmentations ............................................................................................ 230Gnration de classe de stub .............................................................................................. 233Localiser des objets de serveur .......................................................................................... 234Du ct client ..................................................................................................................... 238

    Livre Java.book Page V Mardi, 10. mai 2005 7:33 07

  • VI Table des matires

    Prparer la mise en uvre .................................................................................................. 243Mise en uvre du programme ........................................................................................... 246

    Passage de paramtres aux mthodes distantes ....................................................................... 248Passer des objets locaux ..................................................................................................... 248Passer des objets distants ................................................................................................... 259Objets distants et mthodes equals et hashCode ................................................................ 262Cloner des objets distants ................................................................................................... 262

    Activation des objets du serveur .............................................................................................. 263IDL Java et CORBA ................................................................................................................ 268

    Langage de dfinition dinterfaces ..................................................................................... 270Un exemple en CORBA ..................................................................................................... 274Implmenter des serveurs CORBA .................................................................................... 283

    Appels de mthode distante avec SOAP .................................................................................. 288

    Chapitre 5. Swing ....................................................................................................................... 295Listes ........................................................................................................................................ 295

    Le composant JList ............................................................................................................ 296Modles de listes ................................................................................................................ 302Insrer et supprimer des valeurs ......................................................................................... 306Afficher des valeurs ............................................................................................................ 308

    Arbres ...................................................................................................................................... 312Exemples darbres .............................................................................................................. 314Enumration de nuds ....................................................................................................... 330Afficher les nuds .............................................................................................................. 332Ecouter les vnements des arbres ..................................................................................... 338Modles darbre personnaliss ........................................................................................... 344

    Tableaux ................................................................................................................................... 352Un tableau simple ............................................................................................................... 352Modles de tableaux ........................................................................................................... 356Affichage et modification des cellules ............................................................................... 370Travailler avec les lignes et les colonnes ........................................................................... 384

    Composants de texte styliss ................................................................................................... 393Indicateurs de progression ....................................................................................................... 399

    Barres de progression ......................................................................................................... 399Contrleurs de progression ................................................................................................ 404Surveiller la progression des flux dentre ......................................................................... 408

    Organisateurs de composants ................................................................................................... 414Sparateurs ......................................................................................................................... 414Onglets ............................................................................................................................... 418Panneaux de bureau et fentres internes ............................................................................ 423

    Livre Java.book Page VI Mardi, 10. mai 2005 7:33 07

  • Table des matires VII

    Chapitre 6. JavaBeans ............................................................................................................ 441Pourquoi les beans ? ................................................................................................................ 442Le processus dcriture des beans ............................................................................................ 443Construire une application laide des beans .......................................................................... 446

    Intgrer des beans dans des fichiers JAR ........................................................................... 446Composer des beans dans un environnement de gnration .............................................. 448

    Les modles de nom pour les proprits et vnements de bean ..................................................................................................................................... 453Les types de proprits de bean ............................................................................................... 456

    Les proprits simples ........................................................................................................ 456Les proprits indexes ...................................................................................................... 456Les proprits lies ............................................................................................................. 457Proprits contraintes ......................................................................................................... 459

    Les classes BeanInfo ................................................................................................................ 465Les diteurs de proprits ........................................................................................................ 470

    Ecrire un diteur de proprits ........................................................................................... 477Les "customizers" .................................................................................................................... 491

    Ecrire une classe Customizer ............................................................................................. 493La persistance des JavaBeans .................................................................................................. 500

    Utiliser la persistance des JavaBeans pour des donnes arbitraires ................................... 504Un exemple complet de persistance des JavaBeans ........................................................... 510

    Chapitre 7. La scurit ............................................................................................................... 523Les chargeurs de classe ............................................................................................................ 524

    Utiliser des chargeurs de classe comme espaces de nom ................................................... 526Ecrire votre propre chargeur de classe ............................................................................... 527

    La vrification des bytecodes ................................................................................................... 532Les gestionnaires de scurit et les permissions ...................................................................... 537

    La scurit de la plate-forme Java 2 ................................................................................... 539Les fichiers de rgles de scurit ........................................................................................ 542Les permissions personnalises ......................................................................................... 549Implmenter une classe de permissions ............................................................................. 550Un gestionnaire de scurit personnalis ........................................................................... 556Authentifier les utilisateurs ................................................................................................ 563

    Modules didentification JAAS ................................................................................................ 568Signatures numriques ............................................................................................................. 577

    Les condenss de message ................................................................................................. 578Les signatures numriques ................................................................................................. 583

    Lauthentification des messages ............................................................................................... 591Le format de certification X.509 ........................................................................................ 593

    Livre Java.book Page VII Mardi, 10. mai 2005 7:33 07

  • VIII Table des matires

    Gnrer des certificats ........................................................................................................ 596Signer des certificats .......................................................................................................... 599

    La signature de code ................................................................................................................ 606Signer des fichiers JAR ...................................................................................................... 606Les certificats de dveloppeur de logiciel .......................................................................... 610

    Le cryptage .............................................................................................................................. 612Chiffres symtriques .......................................................................................................... 612Flux de chiffres .................................................................................................................. 618Chiffres de cls publiques .................................................................................................. 619

    Chapitre 8. Internationalisation ................................................................................................ 625Les paramtres rgionaux ........................................................................................................ 626Le format des nombres ............................................................................................................ 632Devises ..................................................................................................................................... 637La date et lheure ..................................................................................................................... 638Classement ............................................................................................................................... 646

    Formatage de message ....................................................................................................... 653Formats de choix ................................................................................................................ 655

    Fichiers texte et jeux de caractres .......................................................................................... 657Codage de caractres des fichiers source ........................................................................... 658

    Les groupes de ressources ....................................................................................................... 659Trouver lemplacement des groupes de ressources ............................................................ 659Fichiers de proprits ......................................................................................................... 660Classes de groupes ............................................................................................................. 661

    Un exemple complet ................................................................................................................ 663

    Chapitre 9. Mthodes natives .................................................................................................... 677Appeler une fonction C partir du langage Java ..................................................................... 679

    Travailler avec la fonction printf ........................................................................................ 680Les paramtres numriques et les valeurs renvoyes ............................................................... 685

    Utiliser printf pour le formatage de nombres ..................................................................... 685Les paramtres chane .............................................................................................................. 686

    Appeler sprint dans une mthode native ............................................................................ 690Accder aux champs ............................................................................................................... 692

    Accder aux champs dinstance ......................................................................................... 692Accder aux champs statiques ........................................................................................... 697

    Coder les signatures ................................................................................................................. 697Appeler les mthodes Java ....................................................................................................... 699

    Les mthodes non statiques ................................................................................................ 699Les mthodes statiques ....................................................................................................... 700

    Livre Java.book Page VIII Mardi, 10. mai 2005 7:33 07

  • Table des matires IX

    Les constructeurs ................................................................................................................ 701Autres possibilits dinvocation de mthodes .................................................................... 702

    Accder aux lments de tableaux ........................................................................................... 706La gestion des erreurs .............................................................................................................. 711LAPI dinvocation .................................................................................................................. 715Un exemple exhaustif : accs la base de registres de Windows ................................................ 719

    Aperu de la base de registres de Windows ....................................................................... 719Une interface de plate-forme Java pour accder la base de registres .............................. 720Implmenter les fonctions daccs la base de registres avec un code natif ............................................................................................................... 721

    Chapitre 10. XML ...................................................................................................................... 735Une introduction XML ......................................................................................................... 736

    La structure dun document XML ..................................................................................... 738Analyse dun document XML ................................................................................................. 741Valider les documents XML .................................................................................................... 752

    Dfinitions du type de document (DTD) ............................................................................ 753XML Schema ..................................................................................................................... 760Un exemple pratique .......................................................................................................... 763

    Localiser des informations avec XPath .................................................................................... 776Espaces de noms ...................................................................................................................... 782Lanalyseur SAX ...................................................................................................................... 784Gnration de documents XML ............................................................................................... 789Transformations XSL .............................................................................................................. 797

    Chapitre 11. Annotations ........................................................................................................... 807Ajout de mtadonnes aux programmes .................................................................................. 808Un exemple : annotation des gestionnaires dvnements ...................................................... 809Syntaxe des annotations ........................................................................................................... 814Annotations standard ............................................................................................................... 818

    Annotations ordinaires ....................................................................................................... 819Mta-annotations ................................................................................................................ 819

    Loutil apt pour le traitement dannotations au niveau de la source .............................................................................................................. 822Ingnierie des bytecodes .......................................................................................................... 829

    Modifier les bytecodes au moment du chargement ............................................................ 837

    Index ............................................................................................................................................. 841

    Livre Java.book Page IX Mardi, 10. mai 2005 7:33 07

  • Livre Java.book Page X Mardi, 10. mai 2005 7:33 07

  • IntroductionQuelques mots au lecteur

    Le livre que vous tenez entre les mains est le second volume de la cinquime dition de louvrage Aucur de Java. Le premier volume traite les caractristiques essentielles du langage. Il aborde notam-ment les sujets avancs quun programmeur doit connatre pour le dveloppement dun logicielprofessionnel. Dans le prsent volume, comme pour le premier volume et les ditions prcdentes dece livre, nous nous adressons donc aux programmeurs qui veulent utiliser le langage Java sur desprojets rels.Important : si vous faites partie des dveloppeurs expriments qui sont laise avec les nouveauxmodles dvnements et les caractristiques avances de ce langage, il nest pas ncessaire de lirele premier volume pour profiter du prsent volume. Cependant, en cas de besoin, nous faisons rf-rence des sections du premier volume, et nous esprons que vous lachterez si ce nest dj fait.De plus, vous trouverez toutes les informations gnrales ncessaires dans nimporte quel livredintroduction la plate-forme Java.

    Enfin, lorsquon crit un livre, les erreurs et les imprcisions sont invitables. Nous serions trsheureux que vous nous les rapportiez. Naturellement, nous prfrerions ne les voir mentionnesquune seule fois, cest pourquoi nous avons cr un site Web sur http://www.horstmann.com/corejava.html, avec une FAQ, des corrections derreurs et des remarques gnrales. Un formulaire,stratgiquement plac la fin de la page Web des erreurs signales (pour vous encourager lire leserreurs dj signales), peut tre utilis pour indiquer les erreurs ou les problmes et pour envoyerdes suggestions destines amliorer les ditions futures.

    A propos de ce livre

    Les chapitres de ce livre sont, pour la plupart, indpendants les uns des autres. Vous devriez pouvoirpasser directement au sujet qui vous intresse le plus et donc lire les chapitres dans nimporte quelordre.

    Le Chapitre 1 aborde les multithreads, qui vous permettent dexcuter des tches en parallle. Unthread est un flot de contrle lintrieur dun programme. Nous vous montrerons comment dfinirdes threads et traiter leur synchronisation. Le multithreading a bien volu dans le JDK 5.0, dontnous vous prsenterons donc les nouveaux mcanismes.

    Le sujet abord dans le Chapitre 2 est le cadre des collections de la plate-forme Java 2. Lorsque vousvoulez rassembler plusieurs objets pour les rcuprer plus tard, vous pouvez utiliser une collec-tion adapte vos besoins, au lieu de vous contenter dassembler ces lments dans un Vector.

    Livre Java.book Page 1 Mardi, 10. mai 2005 7:33 07

  • 2 Au cur de Java 2 - Fonctions avances

    Ce chapitre vous montre comment tirer profit des collections standard qui ont t prtablies votreintention. Le chapitre a t compltement rvis du fait des collections gnriques du JDK 5.0.Le Chapitre 3 se concentre sur la programmation des bases de donnes. Il parle de JDBC, lAPI deconnectivit de base de donnes de Java, qui permet de se connecter des bases de donnes relation-nelles. Nous vous montrerons comment crire des programmes pratiques pour traiter les tchescourantes des bases de donnes, en utilisant un sous-ensemble de lAPI JDBC. Une tude compltede lAPI JDBC ncessiterait un livre entier, presque aussi long que celui-ci. Nous terminerons cechapitre par une brve introduction aux bases de donnes hirarchiques et verrons le JNDI et leprotocole LDAP.Le Chapitre 4 comprend les objets distribus. Nous parlerons en dtail duRMI (Remote MethodInvocation). Cette API vous permet de travailler avec des objets Java qui sont distribus sur plusieursmachines. Nous verrons aussi brivement CORBA (Common Object Request Broker Architecture) etvous montrerons comment des objets crits en C++ et en Java peuvent communiquer. Nous termi-nerons le chapitre par une discussion sur SOAP (Simple Object Access Protocol) et vous montreronsun exemple dans lequel un programme Java communique avec le service Web dAmazon.Le Chapitre 5 contient toutes les techniques de Swing qui navaient pas leur place dans le Volume 1,spcialement les composants darbres et de tables, importants mais complexes. Nous vous montre-rons les utilisations principales des panneaux ddition et limplmentation Java dune interface "plusieurs documents" ainsi que les indicateurs de progression utiliss dans des programmes avecmultithread. L encore, nous nous concentrerons sur les constructions les plus utiles que vous pour-rez rencontrer dans la pratique, puisquune prsentation de la bibliothque Swing dans son int-gralit ncessiterait plusieurs volumes et ne serait intressante que pour des taxinomistes spcialiss.Le Chapitre 6 vous montre ce que vous devez savoir sur lAPI des composants de la plate-formeJava : JavaBeans. Vous verrez comment crire vos propres beans, que dautres programmeurs pour-ront manipuler et intgrer dans leurs environnements de construction intgrs. Nous terminerons cechapitre en vous montrant comment utiliser la persistance des JavaBeans pour stocker vos donnesdans un format adapt une conservation long terme, contrairement la srialisation.Le Chapitre 7 aborde le modle de scurit. La plate-forme Java a t conue ds le dpart pour tresre, et ce chapitre vous amne dans ses coulisses pour vous faire voir comment cette architecture at implmente. Nous vous montrerons comment crire vos propres chargeurs de classe et desgestionnaires de scurit pour des applications cibles. Ensuite, nous tudierons la nouvelle API descurit, qui vous permet dutiliser des caractristiques aussi importantes que les messages et codessigns, lautorisation, lauthentification et le cryptage. Ce chapitre a t totalement mis jour pour leJDK 5.0, de manire prendre en compte les algorithmes de cryptage AES et RSA.Le Chapitre 8 parle dune caractristique spcialise qui, nous semble-t-il, ne peut que prendre delimportance : linternationalisation. Le langage de programmation Java fait partie des quelqueslangages qui ont t conus ds le dpart pour grer Unicode, mais le support de linternationalisa-tion de la plate-forme Java va bien plus loin. Par consquent, vous pouvez internationaliser desapplications Java de sorte quelles fonctionnent non seulement sur plusieurs plates-formes maisaussi dans plusieurs pays. Par exemple, nous vous montrerons comment crire une applet de calcul deretraite en anglais, en allemand ou en chinois, en fonction de la langue du navigateur.Le Chapitre 9 aborde les mthodes natives, qui vous permettent dappeler des mthodes crites pourune machine spcifique, comme lAPI de Microsoft Windows. Bien sr, cette caractristique peut

    Livre Java.book Page 2 Mardi, 10. mai 2005 7:33 07

  • Introduction 3

    tre controverse : ds que des mthodes natives sont utilises, la caractristique interplate-forme deJava disparat. Cependant, tous les programmeurs srieux qui crivent des applications Java pour desplates-formes spcifiques doivent connatre ces techniques. Pour crire des applications srieuses, ilvous faudra parfois passer par lAPI du systme dexploitation de votre plate-forme cible. Nousillustrerons cette technique en vous montrant comment accder aux fonctions de la base de registresous Windows.Le Chapitre 10 traite du XML. Nous vous montrerons comment analyser les fichiers XML, gnrerdu XML et utiliser les transformations XSL. A titre dexemple, nous vous montrerons commentspcifier la mise en page dun formulaire Swing en XML. Ce chapitre a t mis jour pour inclurelAPI XPath qui permet de retrouver plus facilement une aiguille dans la botte de foin XML.Enfin, le Chapitre 11 a t ajout cette dition. Il traite des annotations et des mtadonnes, desfonctionnalits ajoutes au JDK 5.0. Les annotations vous permettent dajouter des informationsarbitraires (les mtadonnes) un programme Java. Nous vous montrerons la manire dont les outilsde traitement collectent ces annotations la source ou au niveau du fichier de classe et commentutiliser les annotations pour influencer le comportement des classes au moment de lexcution. Lesannotations ne servent quaccompagnes doutils, et nous esprons que cette discussion vous aidera choisir ceux qui sont adapts vos besoins.

    ConventionsComme dans de nombreux livres dinformatique, nous utilisons une police courier pour reprsenterle code.

    Ces informations sont signales par une icne de bloc-notes qui ressemble ceci.

    Les astuces utiles sont signales par cette icne.

    Les notes qui vous mettent en garde contre un pige ou une situation dangereuse sont signales par une icne"Attention".

    Il existe un certain nombre de notes C++ qui expliquent la diffrence entre les langages de programmation Java etC++. Vous pouvez simplement les sauter si C++ ne vous intresse pas.

    Interface de programmation dapplication (API)La plate-forme Java possde une vaste bibliothque de programmation, appele aussi API (Applica-tion Programming Interface). Lorsque nous utilisons un appel dAPI pour la premire fois, nous

    INFO

    ASTUCE

    ATTENTION

    INFO C++

    Livre Java.book Page 3 Mardi, 10. mai 2005 7:33 07

  • 4 Au cur de Java 2 - Fonctions avances

    ajoutons une petite description signale par une icne API. Ces descriptions sont un peu moinsformelles mais galement plus riches que celles de la documentation de lAPI officielle en ligne.Les programmes dont le code source se trouve dans le code daccompagnement de cet ouvrage sontprsents comme des exemples. Ainsi, Exemple 4.8 : WarehouseServer.java fait rfrence au codeque vous pouvez tlcharger ladresse http://www.pearsoneducation.fr.

    Livre Java.book Page 4 Mardi, 10. mai 2005 7:33 07

  • 1Multithreads

    Au sommaire de ce chapitre

    Quest-ce quun thread ? Interruption des threads Les tats dun thread Proprits dun thread Synchronisation Verrous morts Collections compatibles avec les threads Callable et Future Executor Synchronizer

    Vous connaissez probablement dj le multitche : la possibilit davoir plusieurs programmestravaillant en mme temps. Par exemple, avec un systme multitche, il est possible dimprimer undocument en mme temps que vous en modifiez un autre ou que vous envoyez un fax. Naturel-lement, moins que vous ne possdiez un ordinateur multiprocesseur, le systme dexploitation estoblig de partager les ressources du processeur, ce qui donne lillusion dune activit parallle. Cetterpartition des ressources est possible parce que la plupart des programmes ne se servent pas delintgralit du temps machine. Par exemple, lorsquun utilisateur saisit des donnes rapidement, ilne prend quun vingtime de seconde par caractre.Il existe deux sortes de multitches. Le premier, appel multitche premptif, interrompt lesprogrammes sans les consulter. Le second est appel multitche coopratif, ou non premptif :chaque programme peut tre interrompu lorsquil en fournit explicitement lautorisation.Windows 3.x et Mac OS 9 constituent des systmes dexploitation coopratifs, alors que UNIX/Linux, Windows NT/XP (et Windows 9x pour les programmes 32 bits) et Mac OS X sont premptifs.Bien que les systmes dexploitation premptifs soient plus difficiles implmenter, ils sont bien

    Livre Java.book Page 5 Mardi, 10. mai 2005 7:33 07

  • 6 Au cur de Java 2 - Fonctions avances

    plus efficaces. Avec un multitche coopratif, un programme mal conu peut bloquer le systmeindfiniment.Les programmes utilisant plusieurs threads dveloppent lide du multitche en limplmentant unniveau plus bas : des programmes individuels peuvent effectuer plusieurs tches en mme temps.Chaque tche est traditionnellement appele un thread. Les programmes qui peuvent excuterplusieurs threads en mme temps sont appels des programmes multithreads. Quelle est donc la diffrence entre plusieurs processus et plusieurs threads ? La diffrence essen-tielle est quun processus possde une copie unique de ses propres variables, alors que les threadspartagent les mmes donnes. Cela peut paratre risqu, et cela lest parfois, comme nous allons levoir un peu plus loin dans ce chapitre. Mais il est bien plus rapide de crer et de dtruire des threadsindividuels que de crer un nouveau processus. Cest pourquoi tous les systmes dexploitationmodernes supportent les multithreads. De plus, la communication entre les processus est bien pluslente et plus restrictive quentre des threads.Les multithreads sont trs utiles dans la pratique. Par exemple, un navigateur doit pouvoir tlchar-ger simultanment plusieurs pages, et un serveur Web doit pouvoir rpondre plusieurs requtessimultanes. Le langage de programmation Java lui-mme se sert dun thread pour grer le ramasse-miettes en tche de fond, ce qui vous pargne la tche de grer la mmoire vous-mme ! Lesprogrammes ayant une interface utilisateur graphique possdent un thread spar pour rcuprerles vnements de linterface utilisateur. Ce chapitre vous montrera comment ajouter des capacitsde multithread dans vos applications Java.Le multithread a considrablement chang dans le JDK 5.0, du fait de lajout dun grand nombre declasses et dinterfaces apportant des implmentations de grande qualit. Celles-ci sont destines auxmcanismes ncessaires la plupart des programmeurs dapplications. Dans ce chapitre, nousverrons les nouvelles fonctionnalits du JDK 5.0 ainsi que les mcanismes classiques de synchro-nisation, et nous vous aiderons faire votre choix.Un petit conseil : la gestion de plusieurs threads peut rapidement devenir trs complexe. Dans cechapitre, nous prsentons tous les outils fournis par le langage de programmation Java pourprogrammer ces threads. Cependant, pour les situations plus dlicates, nous vous suggrons depasser par des ouvrages plus spcialiss, comme Concurrent Programming in Java de Doug Lea(Addison-Wesley, 1999).

    Quest-ce quun thread ?

    Commenons par tudier un programme qui ne se sert pas de plusieurs threads et qui, par cons-quent, empche lutilisateur deffectuer plusieurs tches avec ce programme. Une fois que nouslaurons dissqu, nous vous montrerons combien il est facile de lexcuter dans plusieurs threads.Ce programme fait rebondir une balle en la dplaant en permanence. Si la balle arrive contre unmur, il la fait rebondir (voir Figure 1.1).Ds que vous cliquez sur le bouton "Dmarrer", le programme lance la balle partir du coin sup-rieur gauche de lcran et celle-ci commence rebondir. Le gestionnaire du bouton "Dmarrer"appelle la mthode addBall. Cette mthode contient une boucle progressant sur 1 000 dplace-ments. Chaque appel move dplace lgrement la balle, ajuste la direction si elle rebondit sur unmur, puis redessine lcran.

    Livre Java.book Page 6 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 7

    Ball ball = new Ball();panel.add(ball);

    for (int i = 1; i

  • 8 Au cur de Java 2 - Fonctions avances

    A lvidence, ce nest pas une situation acceptable, et lon ne souhaite pas que les programmes utili-ss se comportent de cette manire lorsquils doivent effectuer des tches longues. Aprs tout, lors-que vous lisez des donnes en passant par une connexion rseau, il est trop courant dtre bloqu parune tche gourmande en temps machine, que vous souhaiteriez vraiment interrompre. Par exemple,supposons que vous chargiez une grande image et que vous dcidiez, aprs en avoir vu une partie,que vous ne voulez pas voir le reste. Il peut alors tre trs intressant de pouvoir cliquer sur unbouton "Arrter" ou "Prcdent" pour interrompre le chargement. Dans la prochaine section, nousvous montrerons comment laisser cette possibilit lutilisateur en excutant les parties critiquesdun programme dans un thread spar.LExemple 1.1 prsente le code de ce programme.

    Exemple 1.1 : Bounce.java

    import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import java.util.*;import javax.swing.*;

    /** Prsente une balle rebondissante anime.*/public class Bounce{ public static void main(String[] args) { JFrame frame = new BounceFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}

    /** Une balle qui bouge et rebondit sur les bords dun rectangle*/class Ball{ /** Dplace la balle la position suivante, en inversant la direction si elle touche lun des bords */ public void move(Rectangle2D bounds) { x += dx; y += dy; if (x < bounds.getMinX()) { x = bounds.getMinX(); dx = -dx; } if (x + XSIZE >= bounds.getMaxX()) {

    Livre Java.book Page 8 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 9

    x = bounds.getMaxX() - XSIZE; dx = -dx; } if (y < bounds.getMinY()) { y = bounds.getMinY(); dy = -dy; } if (y + YSIZE >= bounds.getMaxY()) { y = bounds.getMaxY() - YSIZE; dy = -dy; } }

    /** Rcupre la forme de la balle sa position actuelle. */ public Ellipse2D getShape() { return new Ellipse2D.Double(x, y, XSIZE, YSIZE); }

    private static final int XSIZE = 15; private static final int YSIZE = 15; private double x = 0; private double y = 0; private double dx = 1; private double dy = 1;}

    /** Lcran o se dessinent les balles.*/class BallPanel extends JPanel{ /** Ajouter une balle lcran. @param b la balle ajouter */ public void add(Ball b) { balls.add(b); }

    public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; for (Ball b: balls) { g2.fill(b.getShape()); } }

    private ArrayList balls = new ArrayList();}

    Livre Java.book Page 9 Mardi, 10. mai 2005 7:33 07

  • 10 Au cur de Java 2 - Fonctions avances

    /** Le bloc avec lcran et les boutons.*/class BounceFrame extends JFrame{ /** Elabore le bloc de lcran pour montrer la balle rebondissante et les boutons Dmarrer et Fermer. */ public BounceFrame() { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); setTitle("Bounce");

    panel = new BallPanel(); add(panel, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); addButton(buttonPanel, "Dmarrer", new ActionListener() { public void actionPerformed(ActionEvent event) { addBall(); } });

    addButton(buttonPanel, "Fermer", new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); add(buttonPanel, BorderLayout.SOUTH); }

    /** Ajoute un bouton un conteneur. @param c le conteneur @param title le nom du bouton @param listener lcouteur daction pour le bouton */ public void addButton(Container c, String title, ActionListener listener) { JButton button = new JButton(title); c.add(button); button.addActionListener(listener); }

    /** Ajoute une balle rebondissante lcran et la fait rebondir 1 000 fois. */ public void addBall() { try {

    Livre Java.book Page 10 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 11

    Ball ball = new Ball(); panel.add(ball);

    for (int i = 1; i

  • 12 Au cur de Java 2 - Fonctions avances

    2. Construisez un objet de votre classe :Runnable r = new MyRunnable();

    3. Construisez un objet Thread partir de linterface Runnable:Thread t = new Thread(r);

    4. Dmarrez le thread :t.start();

    Pour excuter notre programme dans un thread spar, nous devons simplement implmenter uneclasse BallRunnable et placer le code de lanimation dans la mthode run, comme dans le codesuivant :

    class BallRunnable implements Runnable{ . . . public void run() { try { for (int i = 1; i

  • Chapitre 1 Multithreads 13

    Le code complet de ce programme se trouve dans lExemple 1.2.

    Vous pouvez aussi dfinir un thread en formant une sous-classe de la classe Thread, comme ceci :

    class MyThread extends Thread{ public void run() { code de la tche }}

    Vous construisez ensuite un objet de la sous-classe et appelez sa mthode start. Toutefois, cette approche nest plusconseille. Il vaut mieux dcoupler la tche qui doit tre excute en parallle de son mcanisme dexcution. Si vousdisposez de plusieurs tches, crer un thread spar pour chacune serait trop onreux. Vous pouvez plutt utiliser unpool de threads (voir la section Pools de threads, plus loin dans ce chapitre).

    Nappelez pas la mthode run de la classe Thread ou de lobjet Runnable car cela excute directement la tche surle mme thread. Aucun nouveau thread nest dmarr. Appelez plutt la mthode Thread.start. Elle crera unnouveau thread qui excutera la mthode run.

    Exemple 1.2 : BounceThread.java

    import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import java.util.*;import javax.swing.*;

    Figure 1.2

    Excuter plusieurs threads.

    INFO

    ATTENTION

    Livre Java.book Page 13 Mardi, 10. mai 2005 7:33 07

  • 14 Au cur de Java 2 - Fonctions avances

    /** Prsente une balle rebondissante anime.*/public class BounceThread{ public static void main(String[] args) { JFrame frame = new BounceFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}

    /** Un excutable qui anime une balle rebondissante.*/class BallRunnable implements Runnable{ /** Construit lexcutable. @aBall la balle qui doit rebondir @aPanel le composant dans lequel la balle rebondit */ public BallRunnable(Ball aBall, Component aComponent) { ball = aBall; component = aComponent; }

    public void run() { try { for (int i = 1; i

  • Chapitre 1 Multithreads 15

    */class Ball{ /** Dplace la balle la position suivante, en inversant sa direction si elle touche lun des bords */ public void move(Rectangle2D bounds) { x += dx; y += dy; if (x < bounds.getMinX()) { x = bounds.getMinX(); dx = -dx; } if (x + XSIZE >= bounds.getMaxX()) { x = bounds.getMaxX() - XSIZE; dx = -dx; } if (y < bounds.getMinY()) { y = bounds.getMinY(); dy = -dy; } if (y + YSIZE >= bounds.getMaxY()) { y = bounds.getMaxY() - YSIZE; dy = -dy; } }

    /** Rcupre la forme de la balle sa position courante. */ public Ellipse2D getShape() { return new Ellipse2D.Double(x, y, XSIZE, YSIZE); }

    private static final int XSIZE = 15; private static final int YSIZE = 15; private double x = 0; private double y = 0; private double dx = 1; private double dy = 1;}

    /** Lcran qui dessine les balles.*/class BallPanel extends JPanel{ /** Ajoute une balle lcran.

    Livre Java.book Page 15 Mardi, 10. mai 2005 7:33 07

  • 16 Au cur de Java 2 - Fonctions avances

    @param b la balle ajouter */ public void add(Ball b) { balls.add(b); }

    public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; for (Ball b: balls) { g2.fill(b.getShape()); } }

    private ArrayList balls = new ArrayList();}

    /** Le cadre avec lcran et les boutons.*/class BounceFrame extends JFrame{ /** Construit le cadre avec lcran pour afficher la balle rebondissante et les boutons Dmarrer et Fermer */ public BounceFrame() { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); setTitle("BounceThread");

    panel = new BallPanel(); add(panel, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); addButton(buttonPanel, "Dmarrer", new ActionListener() { public void actionPerformed(ActionEvent event) { addBall(); } });

    addButton(buttonPanel, "Fermer", new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); add(buttonPanel, BorderLayout.SOUTH); }

    Livre Java.book Page 16 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 17

    /** Ajoute un bouton au conteneur. @param c le conteneur @param title le titre du bouton @param listener lcouteur daction pour le bouton */ public void addButton(Container c, String title, ActionListener listener) { JButton button = new JButton(title); c.add(button); button.addActionListener(listener); }

    /** Ajoute une balle rebondissante sur le fond et lance un thread pour la faire rebondir */ public void addBall() { Ball b = new Ball(); panel.add(b); Runnable r = new BallRunnable(b, panel); Thread t = new Thread(r); t.start(); }

    private BallPanel panel; public static final int DEFAULT_WIDTH = 450; public static final int DEFAULT_HEIGHT = 350; public static final int STEPS = 1000; public static final int DELAY = 3;}

    java.lang.Thread 1.0

    Thread(Runnable target)

    Construit un nouveau thread qui appelle la mthode run() de la cible spcifie. void start()

    Lance ce thread et appelle sa mthode run(). Cette mthode revient immdiatement. Le nouveauthread est excut en mme temps.

    void run()

    Appelle la mthode run de linterface Runnable associe.

    java.lang.Runnable 1.0

    void run()

    Cette fonction doit tre surcharge, et vous devez y ajouter les instructions qui doivent treexcutes dans le thread correspondant.

    Interrompre des threadsUn thread sarrte lorsque sa mthode run revient. Dans le JDK 1.0, il existait galement unemthode stop quun autre thread aurait pu appeler pour terminer un thread. Mais cette mthode estaujourdhui obsolte (voir plus loin dans ce chapitre).

    Livre Java.book Page 17 Mardi, 10. mai 2005 7:33 07

  • 18 Au cur de Java 2 - Fonctions avances

    Il nexiste donc plus de mthode pour obliger un thread se terminer. Toutefois, il est possibledutiliser la mthode interrupt pour exiger la terminaison dun thread. Lorsque la mthode interrupt est appele sur un thread, lindication du thread est dfinie sur inter-rompu (interrupted). Il sagit dun indicateur boolen prsent dans chaque thread. Chaque threaddoit, loccasion, vrifier sil a t interrompu.Pour savoir si lindication a t dfinie sur interrompu, appelez dabord la mthodeThread.currentThread pour obtenir le thread actuel, puis appelez la mthode isInterrupted:

    while (!Thread.currentThread().isInterrupted() && encore du travail){ faire le travail }

    Cependant, si un thread est bloqu, il ne peut pas dterminer sil est interrompu. Cest ce momentque la mthode InterruptedException intervient. Lorsque la mthode interrupt est appele surun thread bloqu, lappel bloquant (comme sleep ou wait) est termin par une Interrupted-Exception.

    Il nexiste aucune spcification demandant quun thread interrompu doive tre termin. Linterrup-tion dun thread se contente dattirer son attention. Le thread interrompu peut choisir commentragir devant linterruption. Certains threads sont tellement importants quils peuvent tout simple-ment ignorer leur interruption en continuant leur travail. Mais, plus couramment, un thread essaieradinterprter une interruption comme une demande darrt. La mthode run de ce type de thread a laforme suivante :

    public void run(){ try { . . . while (!Thread.currentThread().isInterrupted() && encore du travail) { faire le travail } } catch(InterruptedException e) { // le thread a t interrompu pendant sleep ou wait } finally { nettoyage, si ncessaire } // sort de la mthode run et met fin au thread}

    La vrification isInterrupted nest pas ncessaire si vous appelez la mthode sleep aprs chaqueitration de travail. Cette mthode dclenche une InterruptedException si vous lappelez lorsquelindication est dfinie sur interrompu. Ainsi, si votre boucle appelle sleep, ne vous inquitez pas devrifier linterruption et interceptez simplement lexception. Votre mthode run a ensuite la forme :

    public void run(){ try

    Livre Java.book Page 18 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 19

    { . . . while (effectuer du travail) { effectuer du travail Thread.sleep(delay); } } catch(InterruptedException e) { // le thread a t interrompu pendant le sommeil ou lattente } finally { nettoyage, si ncessaire } // quitter la mthode run met fin au thread}

    Lorsque la mthode sleep dclenche une InterruptedException, elle rinitialise aussi lindication interrompu.

    Curieusement, il existe deux mthodes trs similaires, interrupted et isInterrupted. La mthode interrup-ted est une mthode statique qui vrifie si le thread actuel a t interrompu. De plus, un appel la mthodeinterrupted rinitialise lindication "interrompu" dun thread. Dun autre ct, la mthode isInterrupted estune mthode dinstance que vous pouvez utiliser pour vrifier que nimporte quel thread a t interrompu. Lindication"interrompu" de son argument nest pas modifie.

    Vous trouverez de nombreux exemples de publication de codes o InterruptedException estsilencieux, comme ceci :

    void mySubTask(){ ... try { sleep(delay); } catch (InterruptedException e) {} NE LIGNOREZ PAS! ...}

    Ne faites pas cela ! Si vous ne trouvez rien de bien faire dans la clause catch, il vous reste deuxchoix raisonnables :m Dans la clause catch, appelez Thread.currentThread().interrupt() pour dfinir lindication

    sur interrompu. Lappelant peut alors le tester :void mySubTask(){ ... try { sleep(delay); } catch (InterruptedException e) { Thread().currentThread().interrupt();} ...}

    ATTENTION

    INFO

    Livre Java.book Page 19 Mardi, 10. mai 2005 7:33 07

  • 20 Au cur de Java 2 - Fonctions avances

    m Mieux encore, vous pouvez baliser votre mthode avec throws InterruptedException et laisserle bloc try. Lappelant (ou, au final, la mthode run) peut lintercepter :void mySubTask() throws InterruptedException{ ... sleep(delay); ...}

    java.lang.Thread 1.0

    void interrupt()

    Envoie une demande dinterruption un thread. Lindication "interrompu" du thread est mise true. Si le thread est actuellement bloqu par un appel sleep ou wait, une Interrupted-Exception est dclenche.

    static boolean interrupted()

    Regarde si le thread actuel (cest--dire le thread qui excute cette instruction) a t interrompu.Notez quil sagit dune mthode statique. Cet appel possde un effet annexe : il met lindication"interrompu" du thread courant false.

    boolean isInterrupted()

    Regarde si un thread a t interrompu. Contrairement la mthode static interrupted, cetappel ne change pas lindication "interrompu" du thread.

    static Thread currentThread()

    Renvoie lobjet Thread reprsentant le thread en cours dexcution.

    Les tats dun thread

    Les threads peuvent se trouver dans lun des quatre tats suivants :

    m nouveau ;

    m excutable ;

    m bloqu ;

    m mort.

    Chacun de ces tats est expliqu dans les paragraphes suivants.

    Nouveaux threads

    Lorsque vous crez un thread avec loprateur new (par exemple new Thread(r)), le thread nestpas encore excut. Cela signifie quil se trouve dans ltat nouveau. Lorsquun thread se trouvedans cet tat, le programme na pas encore commenc excuter le code qui se trouve dans cethread. Il faut encore faire quelques oprations avant que ce thread puisse tre excut.

    Livre Java.book Page 20 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 21

    Threads excutables

    Une fois que vous avez invoqu la mthode start, le thread devient excutable. Il se peut que lethread excutable soit ou non en cours dexcution. Cest au systme dexploitation de fournirau thread une fentre dexcution. La spcification Java ne dfinit pas cet tat comme un tat spar.Un thread en cours dexcution reste dans ltat excutable.

    Lorsquun thread sexcute, il ne poursuit pas obligatoirement lopration dans le temps. En ralit,cela peut se rvler souhaitable si des threads sont mis en pause de temps autre afin que dautresthreads aient une occasion de sexcuter. Ce mcanisme dpend directement du systme dexploita-tion. Les systmes de planification premptifs accordent chaque thread excutable une tranche detemps pour effectuer sa tche. Lorsque cette tranche de temps est coule, le systme dexploitationprempte le thread et passe un autre (voir Figure 1.4). Lorsque vous slectionnez le thread suivant,le systme dexploitation prend en compte les priorits des threads (voir plus loin pour en savoirplus sur les priorits).Tous les systmes dexploitation modernes utilisent la planification premptive. Toutefois, les petitsappareils comme les tlphones portables peuvent utiliser la planification cooprative. Dans ces appareils,un thread ne perd le contrle que lorsquil appelle une mthode comme sleep ou yield.

    Sur une machine multiprocesseur, chaque processeur peut excuter un thread, et plusieurs threadspeuvent sexcuter en parallle. Bien entendu, sil y a plus de threads que de processeurs, le gestion-naire est toujours responsable du dcoupage en tranches.Noubliez pas quun thread excutable peut ou non sexcuter tout moment.

    Threads bloqus

    Un thread entre dans ltat bloqu lorsque lune des actions suivantes se produit :

    1. La mthode sleep() du thread est appele, le thread se met en sommeil.

    2. Le thread appelle une opration bloquante sur les entres/sorties, cest--dire une opration quine rendra pas la main lappelant tant que les oprations dentres ou de sorties ne sont pastermines.

    3. Le thread essaie dobtenir un verrou actuellement dtenu par un autre thread. Nous aborderonsles verrous un peu plus loin dans ce chapitre.

    4. Le thread attend une condition.

    5. La mthode suspend du thread est appele. Cependant, celle-ci commence tre dsapprouve,et il vaut mieux viter de lappeler dans votre code.

    La Figure 1.3 montre les diffrents tats dun thread et les transitions possibles dun tat un autre.Lorsquun thread est bloqu (ou, bien sr, lorsquil est mort), un autre thread peut tre prvu pourtre excut. Lorsquun thread bloqu est ractiv (par exemple, parce quil sest endormi pendantun dlai donn, ou parce que lopration dentre/sortie quil attendait est termine), le gestionnaireregarde sil possde une priorit suprieure celle du thread actuellement en cours dexcution.Dans ce cas, il interrompt le thread actuel et slectionne un nouveau thread.

    Livre Java.book Page 21 Mardi, 10. mai 2005 7:33 07

  • 22 Au cur de Java 2 - Fonctions avances

    Pour sortir de ltat bloqu et entrer nouveau dans ltat excutable, un thread doit emprunter lundes chemins suivants :

    1. Si un thread a t mis en sommeil, le nombre spcifi de millisecondes doit tre coul.

    2. Si un thread attend la fin dune opration dentre ou de sortie, cette opration doit tretermine.

    3. Si un thread attend un verrou qui est possd par un autre thread, lautre thread doit avoir rendule verrou. Il est aussi possible dattendre une temporisation. Le thread se dbloque alors la finde la temporisation.

    4. Si un thread attend une condition, un autre thread doit signaler que la condition risque davoirchang (si le thread attend une temporisation, il est dbloqu la fin de la temporisation).

    5. Si un thread a t suspendu, sa mthode resume doit tre appele. Cependant, comme lamthode suspend nest plus utilise, la mthode resume est galement moins utilise, il fautdonc viter de lappeler dans votre code.

    Un thread bloqu peut uniquement tre activ par la mme technique que celle qui la bloqu.En particulier, vous ne pouvez pas appeler sa mthode resume pour dbloquer un thread bloquant.

    Figure 1.3

    Les tats dun thread.

    Bloquersur E/S

    Veille

    Mort

    Nouveau

    Excutable

    BloquEndormi

    TerminEndormi

    Suspendu

    Reprise

    AvertirE/S

    termines

    La mthode runs'arrte

    Dpart

    stop

    Attente duverrouillage

    Verrouillagedisponible

    Livre Java.book Page 22 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 23

    Si vous devez dbloquer une opration dE/S, utilisez le mcanisme de canal de la bibliothque "new I/O". Lorsquunautre thread ferme le canal, le thread bloqu devient nouveau excutable, et lopration bloquante lance uneClosedChannelException.

    Threads morts

    Un thread peut mourir pour lune des deux raisons suivantes :

    m Il meurt dune mort naturelle parce que la mthode run sest termine normalement.

    m Il meurt soudainement parce quune exception non rcupre a mis fin la mthode run.

    En particulier, il est possible de tuer un thread en invoquant sa mthode stop. Cette mthode dclen-che une erreur ThreadDeath qui tue le thread. Cependant, la mthode stop nest plus utilise, et ilfaut viter de lappeler dans votre code.

    Pour savoir si un thread est couramment actif, cest--dire quil est soit excutable, soit bloqu, utili-sez la mthode isAlive. Celle-ci renvoie true si le thread est excutable ou bloqu et false si lethread est nouveau et pas encore excutable ou si le thread est mort.

    Vous ne pouvez pas dterminer si un thread actif est excutable ou bloqu ou si un thread excutable est rellementen cours dexcution. Il est galement impossible de faire la diffrence entre un thread qui nest pas encore excutableet un thread qui est dj mort.

    java.lang.Thread 1.0

    boolean isAlive()

    Renvoie true si le thread a dmarr et nest pas encore termin. void stop()

    Arrte le thread. Cette mthode est aujourdhui obsolte. void suspend()

    Suspend lexcution du thread. Cette mthode est aujourdhui obsolte. void resume()

    Reprend ce thread. Cette mthode nest valide quaprs un appel suspend(). Cette mthodeest aujourdhui obsolte.

    void join()

    Attend la mort du thread spcifi. void join(long millis)

    Attend la mort du thread spcifi ou lcoulement du nombre spcifi de millisecondes.

    ASTUCE

    INFO

    Livre Java.book Page 23 Mardi, 10. mai 2005 7:33 07

  • 24 Au cur de Java 2 - Fonctions avances

    Proprits dun thread Dans les sections suivantes, nous verrons les diverses proprits des threads : priorits des threads,threads dmons, groupes de threads et gestionnaires dexceptions non rcupres.

    Priorits dun thread Dans le langage de programmation Java, chaque thread possde une priorit. Par dfaut, un threadhrite de la priorit de son thread parent. Vous pouvez augmenter ou baisser la priorit de nimportequel thread avec la mthode setPriority. La priorit de nimporte quel thread peut tre choisieentre MIN_ PRIORITY (correspondant 1 dans la classe Thread) et MAX_ PRIORITY (correspondant 10). NORM_ PRIORITY vaut 5.Lorsque le gestionnaire de threads peut choisir un nouveau thread, il choisit gnralement le threadde la plus haute priorit. Toutefois, les priorits de threads sont fortement dpendantes du systme.Lorsque la machine virtuelle compte sur limplmentation des threads de la plate-forme hte, lespriorits de threads Java sont mises en correspondance avec les niveaux de priorit de la plate-formehte, qui peut en avoir plus ou moins.A titre dexemple, Windows NT/XP affiche sept niveaux de priorit. Certaines priorits Java concor-deront avec le mme niveau du systme dexploitation. Dans la machine virtuelle de Sun pourLinux, les priorits de threads sont totalement ignores : tous les threads ont la mme priorit.Par consquent, il vaut mieux considrer les priorits des threads comme des indications destinesau gestionnaire. Ne structurez jamais vos programmes en fonction des niveaux de priorit.

    Si vous souhaitez tout de mme utiliser les priorits, soyez averti dune erreur commune aux dbutants. Si vous dispo-sez de plusieurs threads haute priorit qui bloquent rarement, ceux de moindre priorit risquent de ne jamaissexcuter. Lorsque le gestionnaire dcide dexcuter un nouveau thread, il choisira dabord parmi ceux de plus hautepriorit, mme si cela peut totalement annihiler les threads de moindre priorit.

    java.lang.Thread 1.0 void setPriority(int newPriority)

    Dfinit la priorit de ce thread. Cette priorit doit tre comprise entre Thread. MIN_ PRIORITYet Thread. MAX_ PRIORITY. Utilisez Thread. NORM_ PRIORITY pour une priorit normale.

    static int MIN_PRIORITY

    Dfinit la priorit minimale quun thread peut avoir. La valeur de la priorit minimale est 1. static int NORM_PRIORITY

    Dfinit la priorit par dfaut dun thread. La valeur de la priorit par dfaut est 5. static int MAX_PRIORITY

    Dfinit la priorit maximale quun thread peut avoir. La valeur de la priorit maximale est 10. static void yield()

    Cette mthode arrte le thread en cours dexcution. Sil existe dautres threads excutables dontla priorit est au moins gale celle de ce thread, ils seront traits par la suite. Notez quil sagitdune mthode statique.

    ATTENTION

    Livre Java.book Page 24 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 25

    Threads dmons

    Un thread peut tre transform en thread dmon en appelantt.setDaemon(true);

    Il ny a rien de dmoniaque l-dedans ! Un dmon est simplement un thread qui na aucun autre butdans la vie que de servir dautres threads. On peut citer comme exemples des threads chronomtresqui envoient des "pulsations de temps" rgulires dautres threads. Lorsquil ne reste plus que desthreads dmons, la machine virtuelle se ferme. Il ny a en effet aucun intrt continuer dexcuterun programme si tous les threads restants sont des dmons.

    java.lang.Thread 1.0

    void setDaemon(boolean isDaemon)

    Signale ce thread comme un dmon ou un thread utilisateur. Cette mthode doit tre appeleavant le dmarrage du thread.

    Groupes de threads

    Certains programmes contiennent un nombre important de threads. Il devient alors utile de lesregrouper par fonctionnalits. Par exemple, considrons un navigateur Internet. Si plusieurs threadsessaient dobtenir des images partir dun serveur, et que lutilisateur clique sur un bouton "Arrter"pour interrompre le chargement de la page courante, il est alors pratique de disposer dun moyendinterrompre tous ces threads simultanment. Le langage de programmation Java vous permet deconstruire ce quil appelle un groupe de threads pour que vous puissiez travailler simultanmentavec plusieurs threads.

    Vous pouvez construire un groupe de threads avec le constructeur suivant :

    String groupName = . . .;ThreadGroup g = new ThreadGroup(groupName)

    La chane passe en argument au constructeur ThreadGroup sert identifier le groupe et doit treunique. Vous pouvez alors ajouter des threads au groupe de threads en spcifiant ce dernier dans leconstructeur du thread.

    Thread t = new Thread(g, threadName);

    Pour dterminer si certains threads dun groupe particulier sont toujours excutables, utilisez lamthode activeCount.

    if (g.activeCount() == 0){ // tous les threads du groupe g ont t arrts}

    Pour interrompre tous les threads dun groupe de threads, appelez simplement interrupt sur lobjetdu groupe.

    g.interrupt(); // interrompt tous les threads du groupe g

    Toutefois, les excuteurs permettent deffectuer la mme tche sans utiliser les groupes de threads.

    Livre Java.book Page 25 Mardi, 10. mai 2005 7:33 07

  • 26 Au cur de Java 2 - Fonctions avances

    Les groupes de threads peuvent possder des sous-groupes enfant. Par dfaut, un groupe de threadsnouvellement cr devient un enfant du groupe de threads courant. Mais vous pouvez aussi explici-tement fournir le nom du groupe dans le constructeur (voir les notes dAPI). Des mthodes commeactiveCount et interrupt font rfrence tous les threads de leur groupe et tous les groupesenfant.

    java.lang.Thread 1.0

    Thread(ThreadGroup g, String name)

    Cre un nouveau thread qui appartient un ThreadGroup donn.

    Paramtres : g Le groupe de threads auquel appartient le nouveau thread

    name Le nom du nouveau thread ThreadGroup getThreadGroup()

    Renvoie le groupe de threads de ce thread.

    java.lang.ThreadGroup 1.0

    ThreadGroup(String name)

    Cette mthode cre un nouveau ThreadGroup. Son parent sera le groupe de threads du threadcourant.

    Paramtres : name le nom du nouveau groupe de threads ThreadGroup(ThreadGroup parent, String name)

    Cette mthode cre un nouveau ThreadGroup.

    Paramtres : parent le groupe de threads parent du nouveau groupe de threads

    name le nom du nouveau groupe de threads int activeCount()

    Cette mthode renvoie la borne suprieure correspondant au nombre de threads actifs dans legroupe de threads.

    int enumerate(Thread[] list)

    Renvoie les rfrences de tous les threads actifs dans ce groupe de threads. Vous pouvez utiliserla mthode activeCount() pour renvoyer la borne suprieure du tableau ; cette mthoderenvoie le nombre de threads placs dans le tableau. Si le tableau est trop petit (par exempleparce que dautres threads ont t crs aprs lappel activeCount), autant de threads quepossible sont insrs.

    Paramtres : list un tableau remplir avec les rfrences des threads ThreadGroup getParent()

    Renvoie le parent de ce groupe de threads. void interrupt()

    Interrompt tous les threads de ce groupe de threads et tous ses groupes enfant.

    Livre Java.book Page 26 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 27

    Gestionnaire dexceptions non rcupresLa mthode run dun thread ne peut pas dclencher dexceptions sous contrle, mais elle peut tretermine par une exception hors contrle. Dans ce cas, le thread meurt.Il nexiste toutefois pas de clause catch dans laquelle lexception peut tre propage. Juste avantque le thread ne meure, lexception est transfre un gestionnaire dexceptions non rcupres.Ce gestionnaire doit appartenir une classe qui implmente linterface Thread.UncaughtException-Handler, qui ne possde quune seule mthode :

    void uncaughtException(Thread t, Throwable e)

    Depuis le JDK 5.0, vous pouvez installer un gestionnaire dans nimporte quel thread avec lamthode setUncaughtExceptionHandler. Vous pouvez aussi installer un gestionnaire par dfautpour tous les threads avec la mthode statique setDefaultUncaughtExceptionHandler de laclasse Thread. Un gestionnaire de remplacement pourrait utiliser lAPI didentification pourenvoyer des rapports sur les exceptions non rcupres un fichier journal.Si vous ninstallez pas de gestionnaire par dfaut, le gestionnaire par dfaut vaut null. Mais, si vousninstallez pas de gestionnaire pour un thread particulier, le gestionnaire correspond lobjetThreadGroup du thread.La classe ThreadGroup implmente linterface Thread.UncaughtExceptionHandler. Sa mthodeuncaughtException ralise laction suivante :

    1. Si le groupe de threads a un parent, la mthode uncaughtException du groupe parent estappele.

    2. Sinon, si la mthode Thread.getDefaultExceptionHandler renvoie un gestionnaire non nul,il est appel.

    3. Sinon, si Throwable est une instance de ThreadDeath, il ne se passe rien.4. Sinon, le nom du thread et la trace de Throwable sont affichs sur System.err.

    Cest une trace que vous avez certainement beaucoup vue dans vos programmes.

    Avant le JDK 5.0, il tait impossible dinstaller un gestionnaire dexceptions non rcupres dans chaque thread etde spcifier un gestionnaire par dfaut. Pour installer un gestionnaire, il fallait sous-classer la classe ThreadGroupet surcharger la mthode uncaughtException.

    java.lang.Thread 1.0 static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler

    handler) 5.0 static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()

    5.0

    Dfinissent ou rcuprent le gestionnaire par dfaut pour les exceptions non rcupres. void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler handler) 5.0 Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() 5.0

    Dfinissent ou rcuprent le gestionnaire des exceptions non rcupres. Lorsque aucun gestion-naire nest install, lobjet du groupe de threads devient le gestionnaire.

    INFO

    Livre Java.book Page 27 Mardi, 10. mai 2005 7:33 07

  • 28 Au cur de Java 2 - Fonctions avances

    java.lang.Thread.UncaughtExceptionHandler 5.0

    void uncaughtException(Thread t, Throwable e)

    Dfinit cette mthode de manire consigner un rapport personnalis lorsquun thread setermine avec une exception non rcupre.Paramtres : t le thread termin du fait dune exception non rcupre

    e lobjet de lexception non rcuprejava.lang.ThreadGroup 1.0

    void uncaughtException(Thread t, Throwable e)

    Appelle cette mthode du groupe de threads parent (sil existe un parent) ou le gestionnaire pardfaut de la classe Thread (sil existe un gestionnaire par dfaut). Sinon affiche une trace du fluxderreur standard (toutefois, si e est un objet ThreadDeath, la trace est supprime. Les objetsThreadDeath sont gnrs par la mthode stop, aujourdhui obsolte).

    Synchronisation

    Dans la plupart des applications pratiques base de multithreads, il arrive que plusieurs threadsdoivent partager un accs aux mmes objets. Que se passe-t-il si deux threads ont accs au mmeobjet et que chacun appelle une mthode qui modifie ltat de cet objet ? Comme vous pouvezlimaginer, les threads se font concurrence. Selon lordre dans lequel la donne a t accde, desobjets corrompus peuvent apparatre. Ce type de situation est souvent appel une condition decourse.

    Exemple de condition de course

    Pour viter que plusieurs threads ne corrompent des donnes partages, vous devez apprendrecomment synchroniser laccs. Dans cette section, vous verrez ce qui se passe si vous nutilisez pasde synchronisation. Dans la section suivante, vous verrez comment synchroniser les accs auxobjets.Dans le prochain programme de test, nous simulons une banque possdant plusieurs comptes. Nousgnrons au hasard des transactions qui dplacent de largent entre ces comptes. Chaque comptepossde un thread. Chaque transaction dplace des quantits alatoires dargent, du compte desservipar le thread vers un autre compte choisi alatoirement.Le code de cette simulation est assez simple. Il est principalement constitu de la classe Bank et dela mthode transfer. Cette mthode transfre une certaine somme dargent dun compte vers unautre. Si le compte source ne possde pas assez dargent, lappel prend fin aussitt. Voici le code dela mthode transfer de la classe Bank:

    public void transfer(int from, int to, double amount) // ATTENTION: cette mthode nest pas sre lorsquelle est appele // partir de plusieurs threads{ System.out.print(Thread.currentThread()); accounts[from] -= amount;

    Livre Java.book Page 28 Mardi, 10. mai 2005 7:33 07

  • Chapitre 1 Multithreads 29

    System.out.print(" %10.2f de %d %d", amount, from, to); accounts[to] += amount; System.out.printf(" Solde total: %10.2f%n", getTotalBalance());}

    Voici le code de la classe TransferRunnable. Sa mthode run sort en permanence de largent duncompte bancaire spcifi. A chaque itration, la mthode run choisit au hasard un compte cible etun montant dargent alatoire, puis elle appelle transfer sur lobjet banque, puis elle sendort.

    class TransferRunnable implements Runnable{ ... public void run() { int toAccount = (int) (bank.size() * Math.random()); double amount = maxAmount * Math.random(); bank.transfer(fromAccount, toAccount, amount); Thread.sleep(int) (DELAY * Math.random())); } catch(InterruptedException e) {}}

    Lorsque cette simulation est excute, nous ne savons pas combien dargent se trouve dans chaquecompte bancaire. En revanche, nous savons que la somme de tous les comptes doit rester constante,puisque nous effectuerons uniquement des transferts dargent entre ces comptes.A la fin de chaque transaction, la mthode transfer recalcule le total et laffiche.Ce programme ne sarrte jamais. Il suffit dappuyer sur Ctrl+C pour larrter.Voici un rsultat typique :

    . . .Thread[Thread-11,5,main] 588.48 de 11 44 Solde total: 100000.00Thread[Thread-12,5,main] 976.11 de 12 22 Solde total: 100000.00Thread[Thread-14,5,main] 521.51 de 14 22 Solde total: 100000.00Thread[Thread-13,5,main] 359.89 de 13 81 Solde total: 100000.00. . .Thread[Thread-36,5,main] 401.71 de 36 73 Solde total: 99291.06Thread[Thread-35,5,main] 691.46 de 35 77 Solde total: 99291.06Thread[Thread-37,5,main] 78.64 de 37 3 Solde total: 99291.06Thread[Thread-34,5,main] 197.11 de 34 69 Solde total: 99291.06Thread[Thread-36,5,main] 85.96 de 36 4 Solde total: 99291.06. . .Thread[Thread-4,5,main]Thread[Thread-33,5,main] 7.31 de 31 32 Solde total: 99979.24 627.50 de 4 5 Solde total: 99979.24. . .

    Comme vous pouvez le constater, il y a une erreur importante. Pour certaines transactions, le soldereste 100 000 , ce qui correspond au total correct pour 100 comptes de 10 000 chacun. Maisaprs un certain moment, le solde total est lgrement modifi. Lorsque vous excuterez ceprogramme, vous vous rendrez compte que des erreurs se produisent rapidement, ou au contrairequil faut un certain temps pour que le solde soit corrompu. Cette situation ninspire pas confiance,et vous naurez probable