TUTORIELS 
Les threads en Java : cycle de vie et partage du temps
De sa création jusqu'à sa mort, voici les états par lesquels un thread est susceptible de passer. Nous aborderons également le partage du temps processeur, encore appelé "scheduling".  (26 janvier 2002)
 

Pages 1 | 2

Lors de notre première approche vers les threads en Java nous avions utilisé les deux méthodes existantes pour créer notre thread :

- L'instanciation d'une classe dérivée de la classe Thread.
- L'interface Runnable.

Enfin nous avions terminé cette introduction par un court programme, réunissant deux threads qui affichaient de manière non contrôlée une série de chiffres.

Afin de mieux comprendre pourquoi nous avions obtenu ce résultat, un passage théorique s'impose.

Le cycle de vie d'un thread

Ce cycle peut se résumer en quatre étapes :

- Création du thread, il est prêt
- En exécution (Runnable)
- En attente (Not Runnable)
- Mort

Voyons plus en détails comment se décomposent chacune de ces étapes.

En ce qui concerne la première étape, nous l'avons déjà abordé dans le tutoriel précédent :

(fichier threadTest.java)
public class threadTest extends Thread
{
     public void run()
     {
          for(int i = 1; i<= 10; i++)
               System.out.println(i + " " + getName());
     }

     public static void main (String[] args)
     {
          Thread t1 = new threadTest();
          t1.start();

     }
}

Les deux lignes à retenir ici sont celles en gras. La première crée en fait un objet "vide" pour lequel aucune ressource n'a encore été allouée.
C'est seulement lorsque la deuxième ligne est exécutée que des ressources lui sont attribuées. A partir de ce moment le thread va être planifié. Nous reviendrons sur cette notion.

La seconde étape : l'exécution. Le thread effectue (normalement) ce pour quoi il a été conçu, il est susceptible de quitter cet état pour diverses raisons. Nous en reparlerons lorsque nous détaillerons la planification.

Troisième étape : l'attente. Celle-ci peut être due à plusieurs facteurs.
La méthode sleep() en est un. Elle prend comme paramètres une durée en millisecondes assortie d'une durée facultative en nanosecondes au bout de laquelle le thread sort de son attente.
Autres facteurs, la méthode wait() (nous l'étudierons dans un autre tutoriel), ou le blocage dû à un traitement d'entrées / sorties. Le temps nécessaire pour venir à bout d'un tel type de traitement est très long comparé à celui consommé pour des instructions traditionnelles. En conséquence, un thread qui effectue une opération d'entrée / sortie est placé en état d'attente jusqu'à la fin du traitement, il repasse alors à l'état "prêt".

La mort du thread réprésente la quatrième et dernière étape de ce cycle de vie. Notez que les fonctions stop(), suspend() et resume(), sont "deprecated" et ne doivent plus être employées (risques d'instabilité : le lien donne plus de détails).
Comment alors arrêter un thread ? L'exemple suivant montre une voie possible :

public class threadTest extends Thread
{
     boolean kill_thread = false;
   
     public void run()
     {
          while (kill_thread == false)
               for(int i = 1; i<= 10; i++)
                    System.out.println(i + " " + getName());
     }


     public void stop_thread()
     {
          kill_thread = true;
     }

}

Voyons maintenant en quoi consiste le "scheduling".

Pages 1 | 2

 
[ Arnaud GadalJDNet
 
Accueil | Haut de page