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.
- public class ThreadStopping {
- private Runner runner;
- private Killer killer;
- private static final int DELAY = 1 * 1000;
- ThreadStopping() {
- runner = new Runner("Runner");
- killer = new Killer("Killer");
- }
- public void start() {
- runner.start();
- killer.start();
- }
- public static void main(String[] args) {
- (new ThreadStopping()).start();
- }
- private class Runner extends Thread {
- private volatile boolean halted = false;
- Runner(String s) {
- super(s);
- }
- public void run() {
- setPriority(MAX_PRIORITY);
- for (int i = 0; !halted; i++)
- System.out.println(getName() + " - " + i);
- }
- public void halt() {
- halted = true;
- }
- }
- private class Killer extends Thread {
- Killer(String s) {
- super(s);
- }
- public void run() {
- long now = System.currentTimeMillis();
- long elapsed = 0;
- while (elapsed < DELAY) {
- elapsed = System.currentTimeMillis() - now;
- System.out.println(getName() + " - " + elapsed);
- yield();
- }
- System.out.println(getName() + " - " + elapsed);
- System.out.println(getName() + " - " + "Killing " + runner.getName());
- runner.halt();
- }
- }
- }
$ 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