Le point est
Considérez un programme qui termine un thread qui compte à des intervalles d'environ 500 millisecondes après environ 10 secondes.
(Voir ce manuel pour le code complet)
Main.java
public class Main {
public static void main(String[] args) {
try {
CountupThread t = new CountupThread();
t.start();
Thread.sleep(10000);
t.shutdownRequest();
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
CountupThread.java
public class CountupThread extends Thread {
private long counter = 0;
private volatile boolean shutdownRequested = false;
public void shutdownRequest() {
shutdownRequested = true;
interrupt();
}
...
public final void run() {
try {
while (!isShutdownRequested()) {
doWork();
}
} catch (InterruptedException e) {
} finally {
doShutdown();
}
}
private void doWork() throws InterruptedException {
counter++;
System.out.println("doWork: counter = " + counter);
Thread.sleep(500);
}
...
}
Rôle du demandeur de résiliation Le rôle TerminationRequester émet une demande de terminaison au rôle Terminator. Dans l'exemple de programme, la classe Main a joué ce rôle.
Rôle de terminateur Le rôle Terminator reçoit la demande de terminaison et exécute réellement le traitement de terminaison. Le rôle Terminator fournit une méthode shutdownRequest qui représente une demande d'arrêt. Le rôle de terminateur a un indicateur (verrou) qui indique s'il a reçu ou non une demande de terminaison. Dans l'exemple de programme, la classe CountupThread a joué ce rôle.
N'utilisez pas la méthode stop de la classe Thread Avec stop, le thread se termine avec l'exception java.lang.ThreadDeath, même lorsque la section critique est en cours.
Le test de drapeau à lui seul ne suffit pas Est-il nécessaire d'appeler la ** méthode d'interruption ** dans la méthode shutdownRequest? L'indicateur shutdownRequest n'est-il pas seul? Avec uniquement l'indicateur shutdownRequested, par exemple, si le thread est en veille, peu importe à quel point l'indicateur est défini sur true, le processus d'arrêt ne démarre pas. Il peut démarrer le processus d'arrêt après le temps de sommeil, mais cela le rend moins réactif. Vous pouvez utiliser la méthode d'interruption pour interrompre le sommeil et attendre.
Les tests d'état interrompus seuls ne suffisent pas Au contraire, il ne suffit pas d'appeler cette fois la méthode d'interruption? Par exemple, si vous écrivez ce qui suit dans la méthode doWork que le thread exécute, cela ne fonctionnera pas.
private void doWork() throws InterruptedException {
counter++;
System.out.println("doWork: counter = " + counter);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
À propos de la méthode d'interruption ** Vous pourriez penser que lorsque vous appelez la méthode d'interruption, le thread cible lève toujours une InterruptedException, ce qui est un malentendu. Une méthode appelée interruption ne modifie que l'état d'interruption d'un thread. L'état interrompu est un état qui indique si un thread est interrompu ou non. sleep, wait et join throw InterruptedExcpetion car ils vérifient l'état interrompu du thread dans la méthode et lancent explicitement une InterruptedException. Une fois qu'une InterruptedException est lancée avec wait, sleep, join, le thread n'est plus dans un état interrompu. ** **
Relation Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 1) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 2) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 3) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 4) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 5) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 6) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 7) Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 8) Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 9) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 10) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 11)
Recommended Posts