Der Punkt ist
Stellen Sie sich ein Programm vor, das einen Thread beendet, der nach etwa 10 Sekunden in Intervallen von etwa 500 Millisekunden hochzählt.
(Den gesamten Code finden Sie in diesem Handbuch.)
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);
}
...
}
Rolle des Kündigungsanforderers Die TerminationRequester-Rolle gibt eine Beendigungsanforderung an die Terminator-Rolle aus. Im Beispielprogramm spielte die Hauptklasse diese Rolle.
Terminatorrolle Die Terminator-Rolle empfängt die Beendigungsanforderung und führt die Beendigungsverarbeitung tatsächlich durch. Die Terminator-Rolle stellt eine shutdownRequest-Methode bereit, die eine Beendigungsanforderung darstellt. Die Terminator-Rolle verfügt über ein Flag (Latch), das angibt, ob eine Terminierungsanforderung empfangen wurde oder nicht. Im Beispielprogramm spielte die CountupThread-Klasse diese Rolle.
Verwenden Sie nicht die Stop-Methode der Thread-Klasse Mit stop wird der Thread mit der Ausnahme java.lang.ThreadDeath beendet, auch wenn der kritische Abschnitt ausgeführt wird.
Flaggentests allein reichen nicht aus Ist es notwendig, die ** Interrupt-Methode ** in der shutdownRequest-Methode aufzurufen? Ist das ShutdownRequest-Flag nicht allein? Wenn nur der ShutdownRequested-Flag verwendet wird, wird der Beendigungsprozess nicht gestartet, unabhängig davon, wie stark das Flag auf true gesetzt ist. Möglicherweise wird der Beendigungsprozess nach der Ruhezeit gestartet, dies macht ihn jedoch weniger reaktionsschnell. Sie können die Interrupt-Methode verwenden, um den Schlaf zu unterbrechen und zu warten.
Unterbrochene Zustandstests allein reichen nicht aus Ist es im Gegenteil nicht genug, diesmal nur die Interrupt-Methode aufzurufen? Wenn Sie beispielsweise Folgendes in die doWork-Methode schreiben, die der Thread ausführt, funktioniert dies nicht.
private void doWork() throws InterruptedException {
counter++;
System.out.println("doWork: counter = " + counter);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
Über die Interrupt-Methode ** Sie könnten denken, dass der Ziel-Thread beim Aufrufen der Interrupt-Methode immer eine InterruptedException auslöst, was ein Missverständnis darstellt. Eine Methode namens Interrupt ändert nur den Interrupt-Status eines Threads. Der unterbrochene Zustand ist ein Zustand, der angibt, ob ein Thread unterbrochen ist oder nicht. Sleep, Wait und Join werfen InterruptedExcpetion, da sie den unterbrochenen Status des Threads innerhalb der Methode überprüfen und explizit eine InterruptedException auslösen. Sobald eine InterruptedException mit wait, sleep, join ausgelöst wird, befindet sich der Thread nicht mehr in einem unterbrochenen Zustand. ** ** **
Beziehung Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 1) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 2) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 3) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 4) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 5) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 6) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 7) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 8) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 9) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 10) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 11)
Recommended Posts