Accueil
Accueil
Le
Club
Delphi
Kylix
C
C++
Java
J2EE
DotNET
& C#
Visual
Basic
Access
Pascal
Dev
Web
PHP
ASP
XML
UML
SQL
SGBD
Win
Linux
Autres



Qu'est ce qu'un thread ?
auteur : Clément Cunin
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 ! :-)

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

Comment créer un thread ?
auteur : Clément Cunin
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 !).

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

Pourquoi toutes les méthodes de la classe Thread sont marquées "deprecated" ?
auteur : Clément Cunin
Pour ceux qui maîtrisent l'anglais, un petit tour sur le site de Sun : http://java.sun.com/j2se/1.4/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().

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

Comment terminer un thread sans la méthode stop() ?
auteur : Clément Cunin
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().

/** 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.

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" ?).

lien : Pourquoi toutes les méthodes de la classe Thread sont marquées "deprecated" ?
lien : Comment faire un minuteur (timer) facilement ?
lien : Programmation des Threads en Java par Valère VIANDIER

Comment faire un minuteur (timer) facilement ?
auteur : Johann Heymes
On peut utiliser la classe java.lang.Thread ou implémenter l'interface java.lang.Runnable, mais suivant les cas de figure cela représente beaucoup de code et de contraintes. En effet, les instructions qui affectent ou dépendent d'un composant graphique Swing doivent être effectuées par le processus d'évènement (the event-dispatching thread). Par conséquent si l'on utilise la classe Thread ou l'interface Runnable il est nécessaire d'utiliser les méthodes : invokeLater(java.lang.Runnable) ou invokeAndWait(java.lang.Runnable)" javax.swing.SwingUtilities.

La classe Timer :
La classe javax.swing.Timer remplace avantageusement l'utilisation directe de thread. Elle génère un évènement à intervalles réguliers (à la milli-seconde). C'est le "event-dispatching thread" qui exécute l'évènement, donc on peut directement modifier des objets graphiques.

Méthodes importantes :
le constructeur de javax.swing.Timer :

public Timer (int delay, ActionListener listener); /** delay = l'intervalle de temps entre chaque évènement. * listener = l'objetécouteur de ces evènements. */
méthode permettant de lancer le processus :

public void start();
méthode permettant de stopper le processus :

public void stop();
Note :
Cette méthode est à utiliser uniquement si le traitement à faire est court en temps d'exécution sinon on aura une interface non réactive pendant le traitement ....

téléchargement : Exemple d'utilisation pour faire un compteur.

Comment faire une "pause" dans mon application ?
auteur : bahamouth
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 courrant à cesser son exécution pendant le temps passé en paramètres.

Par exemple :

long milliSecondes = 500L; int nanosSecondes = 6000; Thread.sleep(milliSecondes, nanosSecondes); // ou Thread.sleep(milliSecondes);
Ces deux méthodes sont susceptibles de lever une InterruptedException.


Ou trouver plus d'informations sur les Threads ?
auteur : Ioan Calapodescu
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.

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


Consultez les autres F.A.Q's

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 © 2004 Developpez LLC : Tous droits réservés Developpez LLC. Aucune reproduction, ne peux 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.
Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright 2000..2004 www.developpez.com