Les FAQs Java :
FAQ JAVA FAQ Java EE FAQ Java ME FAQ Java XML FAQ JavaFX FAQ Java GUI FAQ Struts FAQ JSF FAQ JDBC JDO FAQ Hibernate FAQ Spring FAQ Eclipse FAQ NetBeans FAQ JCreator FAQ Maven 2

FAQ JavaConsultez toutes les FAQ

Nombre d'auteurs : 53, nombre de questions : 231, dernière mise à jour : 26 janvier 2014 

 
OuvrirSommaireGénéralitésGestion des threads

Définition :
Un thread désigne un point d'exécution dans le programme. En fait, le langage Java est multi-thread, c'est à dire qu'il peut exécuter du code à plusieurs endroits de façon indépendante.

Exemple d'utilisation :
L'utilisation des threads est très fréquente dans la programmation réseau. Un client FTP peut télécharger plusieurs fichiers, naviguer sur plusieurs serveurs en même temps, chaque connexion étant gérée par un thread différent. Autre exemple : dans un traitement de texte, un thread s'occupe de ce que tape l'utilisateur, un autre est en charge de souligner les erreurs, un 3ème se charge de faire parler le trombone ! :-)

Créé le 22 mars 2002  par Clément Cunin

Lien : Comment créer un thread ?
Lien : Programmation des Threads en Java par Valère VIANDIER

Créer un thread est très simple en Java. Deux solutions s'offrent à vous :

Dériver de la class Thread :
Vous pouvez créer une nouvelle classe qui dérive de la classe java.lang.Thread. Il suffit ensuite de redéfinir la méthode run(). C'est cette méthode que le thread va exécuter.

Implémenter java.lang.Runnable :
Si vous ne souhaitez pas faire une classe dédiée à la gestion du processus, vous pouvez simplement implémenter l'interface java.lang.Runnable et définir la méthode run(). Ensuite il suffit de créer un objet java.lang.Thread en lui passant la classe en paramètre.

Dans tous les cas :
Pour lancer l'exécution d'un thread vous devez exécuter la méthode start() et en aucun cas exécuter vous-même la méthode run() (L'exécution se déroulerait alors dans le processus courant !).

Mis à jour le 22 mars 2002  par Clément Cunin

Lien : Qu'est ce qu'un thread ?
Lien : Comment terminer un thread sans la méthode stop() ?
Lien : Programmation des Threads en Java par Valère VIANDIER

Pour ceux qui maîtrisent l'anglais, un petit tour sur le site de Sun : http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html.

Pour les autres, toutes ces méthodes ont été marquées deprecated car, sous certaines conditions et sans qu'il y ait d'erreur de conception, l'application peut se bloquer. Typiquement, lorsqu'un thread est tué, il n'est pas possible de savoir ce qu'il était en train de faire, il est donc possible qu'il soit arrêté au milieu d'une modification d'un objet; cet objet est donc laissé dans un état incohérent. Des problèmes similaires peuvent se produire avec les méthodes suspend() et resume().

Mis à jour le 6 mai 2002  par Clément Cunin

Lien : Comment terminer un thread sans la méthode stop() ?
Lien : Qu'est ce qu'une méthode 'deprecated' ?
Lien : Programmation des Threads en Java par Valère VIANDIER

La méthode stop() de la classe java.lang.Thread étant dépréciée, il est nécessaire de prévoir soit-même la possibilité d'arrêter le processus.

Squelette standard d'un Thread
Ce squelette permet de facilement arrêter le processus sans utiliser la méthode dépréciée stop().

 
Sélectionnez

/** Ce boolean sera utilisé pour signaler au 
 * processus s'il doit continuer ou s'arrêter.
 */
private boolean stopThread = false;
 
public void run() {
        boolean fin = false;
 
        while( !fin ) {
                try {
                        // traitement
 
                        synchronized(this) {
                                Thead.yield();
 
                                // lecture du boolean 
                                fin = this.stopThread;
                        } 
                } catch( InterruptedException e ) {
 
                } 
        } 
} 
 
public synchronized void stop() {
        this.stopThread = true;
} 

2ème squelette standard
La solution précédente est adaptée aux threads qui effectuent régulièrement le même traitement. Si le traitement est très long, il peut être nécessaire de tester la requête de fin en cours de traitement. Le plus simple est alors de lever une exception en cours de traitement.

 
Sélectionnez

private boolean stopThread = false;
 
public synchronized void testFin() throws InterruptedException {
        if( stopThread ) {
                throw new InterruptedException();
        } 
} 
public void run() {
        try {
                // traitement avec un appel régulier à testFin();
        } catch( InterruptedException e ) {
 
        } 
} 
public synchronized void stop() {
        this.stopThread = true;
} 

Attention : les appels à la méthode testFin() doivent être effectués uniquement lorsque tous les objets sont dans un état cohérent. (voir :Pourquoi toutes les méthodes de la classe Thread sont marquées 'deprecated' ?).

Mis à jour le 11 octobre 2002  par Clément Cunin

Lien : Pourquoi toutes les méthodes de la classe Thread sont marquées 'deprecated' ?
Lien : Programmation des Threads en Java par Valère VIANDIER

On peut simuler une "pause" dans l'exécution d'une application en utilisant la méthode sleep() de la classe Thread. Cette méthode force le Thread courant à cesser son exécution pendant le temps passé en paramètres.

Par exemple :

 
Sélectionnez

long milliSecondes = 500L; 
int nanosSecondes = 6000; 
Thread.sleep(milliSecondes, nanosSecondes);
// ou
Thread.sleep(milliSecondes);

Ces deux méthodes sont susceptibles de lever une InterruptedException.

Mis à jour le 29 octobre 2008  par bahamouth

Pour mieux comprendre l'utilisation des Threads, vous pouvez vous pencher sur ces deux tutoriels :

Depuis J2SE 5.0, java dispose aussi du package java.util.concurrent qui permet une meilleure gestion des concurrences.

Créé le 12 décembre 2004  par Ioan Calapodescu

Lien : Programmation des Threads en Java, première partie
Lien : Sémaphores et Mutex en Delphi et Java
Lien : Package java.util.concurrent

Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs : - Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement : "Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement". - Pour ce qui est des autres contributions : Copyright © 2014 Developpez LLC : Tous droits réservés Developpez LLC. Aucune reproduction, ne peut en être faite sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.