Étendre la classe Thread                        

Étendre la classe Thread

     

Voici un premier programme dont l'objectif est de montrer uniquement comment on définit et comment on démarre un thread.

Le programme (le main, qui tourne dans un premier thread, c'est-à-dire une première file d'exécution) doit lancer trois threads qui écrivent chacun deux fois un même mot. On gère la priorité des threads (ce qui n'est pas toujours nécessaire). Après avoir écrit la première occurrence de son mot, la priorité du thread devient dans notre exemple minimum.

A propos de la priorité
Un thread A qui a une priorité supérieure à un celle d'un autre thread B est en général exécuté avant B. Tous les threads qui ont la priorité la plus élevée peuvent avoir alternativement un peu de temps du processeur, avec un ordre indéterminé.
À sa création, un thread a par défaut la même priorité que le thread qui lui a donné naissance.
Lorsqu'un thread intervient dans le cadre d'une interface graphique, il faut prendre soin de lui donner une priorité faible de façon à ne pas empêcher le traitement des événements.

Voici maintenant le programme de notre exemple.

class Repetiteur extends Thread
{
  String chaine;

  Repetiteur(String chaine)
    {
      this.chaine=chaine;
    }
  
  public void run()
    {
	System.out.println(chaine);
	setPriority(Thread.MIN_PRIORITY);
	System.out.println(chaine);
    }
}

class Ecrivain
{
  public static void main(String[] argv)
    {
      System.out.println("priorite actuelle : "+
		 	 Thread.currentThread().getPriority());
      System.out.println("priorite minimum : "+
			 Thread.MIN_PRIORITY);
      System.out.println("priorite normale : "+
			 Thread.NORM_PRIORITY);
      System.out.println("priorite maximum : "+
			 Thread.MAX_PRIORITY);

      System.out.println("Nombre de threads : " + Thread.activeCount());
      //les trois threads qui suivent vont tourner en parallele avec le thread main,   
      //au moins de maniere simulee      
      Repetiteur r1 = new Repetiteur("soleil");
      r1.start();;
      Repetiteur r2 = new Repetiteur("neige");
      r2.start();
      Repetiteur r3 = new Repetiteur("ski");
      r3.start();
      System.out.println("A la montagne");
    } 
}
On obtient :
     
priorite actuelle : 5
priorite minimum : 1
priorite normale : 5
priorite maximum : 10
Nombre de threads : 1
Nombre de threads : 2
Nombre de threads : 3
Nombre de threads : 4
A la montagne
soleil  
neige  
ski    
ski 
soleil  
neige 
Sur un autre système, ou bien même avec une autre exécution du même programme, on peut obtenir une sortie différente. Les règles de priorité ne sont pas toujours strictement respectées.

Avec l'exécution reproduite ci-dessus, le premier thread, après avoir écrit soleil, devient moins prioritaire et laisse le tour au deuxième thread qui écrit neige qui a son tour laisse la place au troisième thread qui écrit ski. Les deux mots ski sont écrits l'un après l'autre car les trois threads ont à ce moment la même priorité. Le troisième thread termine donc son travail avant que les deux threads écrivant les mots soleil et neige ne se terminent.

Vous pouvez accéder à Ecrivain.java et à Repetiteur.java.


Thread : classe du paquetage java.lang que l'on peut étendre pour obtenir une classe dont l'instanciation permettra de créer des threads.
setPriority : la méthode setPriority de la classe java.lang.Thread permet de fixe le niveau de priorité d'un thread.
Thread.MIN_PRIORITY : priorité minimum pour une thread.
public void run() : cette méthode est définie dans la classe java.lang.Thread, où ; il faut la redéfinir en y donnant le code correspondant à ce qu'on attend du thread correspondant. La méthode run doit être appelée par l'intermédiaire de la méthode start si on veut la faire tourner dans une nouvelle file d'exécution.
Thread.activeCount(); : renvoie le nombre de threads actifs.
r1.start() : fait exécuter dans le thread r1 la méthode run de celui-ci.
System.out.println("A la montagne"); : observez que cette instruction est exécutée alors que les trois threads autre que la thread principale n'ont pas encore effectué d'affichage.
Thread.currentThread() : la méthode de classe currentThread() retourne une instance de la classe Thread qui est le thread en cours d'exécution.

© Irène Charon, Télécom ParisTech 2011