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.
© Irène Charon, Télécom ParisTech 2011