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


Le partage du processeur : "scheduling"

Revenons sur le terme "planifié" que nous avons évoqué lors de la première étape ci-dessus.
Sur un système doté d'un processeur unique, il est évident que deux threads ne peuvent pas s'exécuter en même temps, même si le programme en donne l'illusion.
La gestion des threads repose en fait sur la planification, encore appelée "scheduling".

Les threads sont classés selon leur priorité. Celle-ci est une valeur comprise entre "MIN_PRIORITY" et "MAX_PRIORITY", (1 et 10), ce sont deux variables statiques de la classe Thread. Lorsqu'un thread est crée il lui est attribué la priorité de celui qui l'a crée (5 par défaut).
Deux threads de même priorité ont normalement la même chance de se voir allouer du temps processeur.

Il est possible de modifier cette valeur avec la méthode setPriority() :

public class threadTest extends Thread
{
     // Execution en paralllele de 2 threads non synchronises
     public static void main (String[] args)
     {
          threadTest t1 = new threadTest();
          threadTest t2 = new threadTest();
          t1.start();
          t2.start();
          System.out.println("priorite t1 par defaut : " + t1.getPriority());
          t1.setPriority(Thread.MAX_PRIORITY);
          System.out.println("priorite t1 apres modif : " + t1.getPriority());
          t2.setPriority(Thread.MIN_PRIORITY);
     }

     public void run()
     {
          for(int i = 1; i<= 10; i++)
          System.out.println(i + " " + getName());
     }
}

Contrairement à ce que nous avions obtenu en fin du tutoriel précédent, le thread "t1" ("Thread-0") prend l'avantage grâce à sa priorité maximale :

(Les "..." signale une série de ligne identique, à l'indice près)
priorite t1 par defaut : 5
1 Thread-0
... Thread-0
10 Thread-0
priorite t1 apres modif : 10
1 Thread-1
... Thread-1
10 Thread-1

Ce que nous observions la dernière fois (test effectué sous Windows 2000) dénotait d'un système d'exploitation pratiquant le "découpage de temps" ou "time-slicing". Nous allons voir à quoi cela correspond.

Lorsque plusieurs threads sont dans la file d'attente, c'est celui qui possède la priorité la plus importante qui est choisi. A noter également, un thread en cours d'exécution peut à tout moment être interrompu par l'arrivée d'un thread possédant une priorité plus importante.

Par défaut le runtime Java ne pratique pas le découpage de temps, il se base uniquement sur la priorité du thread. Cependant le scheduling diffère selon les systèmes d'exploitation.
Alors que notre "Windows" pratique le découpage de temps, d'autres systèmes permettent au thread qui a la plus haute priorité de s'exécuter jusqu'à sa mort, ce qui peut poser des problèmes si celui-ci dure trop longtemps.

La méthode yield() permet d'interrompre le déroulement d'un thread de manière presque transparente et permettre ainsi à d'autres threads de même priorité de s'exécuter. Attention, pour les systèmes d'exploitation qui ne pratiquent pas le "time-slicing", si vous choisissez d'utiliser cette méthode pour passer la main temporairement à un autre thread, n'oubliez pas d'utiliser celle-ci dans les threads susceptibles de prendre la main sans quoi le thread initial ne pourra pas reprendre.

Ces bases théoriques étant posées, nous pourrons aborder plus sereinement dans un prochain tutoriel la synchronisation des threads.

Pages 1 | 2

 
[ Arnaud GadalJDNet
 
Accueil | Haut de page