3

Arrêter un Thread

Le programme ThreadStopping démarre deux Threads : un Runner et un Killer. Le Runner affiche un compteur dans une boucle. Le Killer chasse le Runner pendant un temps donné avant de l'arrêter.

  1. public class ThreadStopping {
  2.     private Runner runner;
  3.  
  4.     private Killer killer;
  5.  
  6.     private static final int DELAY = 1 * 1000;
  7.  
  8.     ThreadStopping() {
  9.         runner = new Runner("Runner");
  10.         killer = new Killer("Killer");
  11.     }
  12.  
  13.     public void start() {
  14.         runner.start();
  15.         killer.start();
  16.     }
  17.  
  18.     public static void main(String[] args) {
  19.         (new ThreadStopping()).start();
  20.     }
  21.  
  22.     private class Runner extends Thread {
  23.         private volatile boolean halted = false;
  24.  
  25.         Runner(String s) {
  26.             super(s);
  27.         }
  28.  
  29.         public void run() {
  30.             setPriority(MAX_PRIORITY);
  31.             for (int i = 0; !halted; i++)
  32.                 System.out.println(getName() + " - " + i);
  33.         }
  34.  
  35.         public void halt() {
  36.             halted = true;
  37.         }
  38.     }
  39.  
  40.     private class Killer extends Thread {
  41.         Killer(String s) {
  42.             super(s);
  43.         }
  44.  
  45.         public void run() {
  46.             long now = System.currentTimeMillis();
  47.             long elapsed = 0;
  48.  
  49.             while (elapsed < DELAY) {
  50.                 elapsed = System.currentTimeMillis() - now;
  51.                 System.out.println(getName() + " - " + elapsed);
  52.                 yield();
  53.             }
  54.             System.out.println(getName() + " - " + elapsed);
  55.             System.out.println(getName() + " - " + "Killing " + runner.getName());
  56.             runner.halt();
  57.         }
  58.     }
  59. }
$ javac ThreadStopping.java
$ java ThreadStopping
Killer - 0
Runner - 0
Runner - 1
Runner - 2
...
Runner - 15
Killer - 3
Killer - 5
...
Runner - 107393
Runner - 107394
Killer - 1154
Killer - Killing Runner
Runner - 107395
Runner - 107396

La sortie du programme montre que le Runner et le Killer s'exécutent alternativement. Dès que le Killer a couru plus de 1 seconde, il tue le Runner. Des messages du Runner continuent à s'afficher après qu'il a été arrêté parce que le tampon de sortie est vidé. Ajoutez un appel à System.out.flush() après l'affichage des messages pour vider immédiatement la sortie. Le programme sera plus lent. Il est encore possible qu'un dernier message s'affiche après que le Killer a tué le Runner si le Runner a été interrompu dans sa boucle avant de tester le drapeau halted.

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].