Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 12)

javathread.jpeg

Zweiphasen-Abschlussmuster

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); 
    } 
 
    ... 
}

Charakter

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.

Tipps zur Erweiterung Ihres Denkens

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

Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 10)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 7)
Zusammenfassung von "In Java gelernte Entwurfsmuster (Multithread Edition)" (Teil 3)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 9)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 6)
Zusammenfassung von "In Java gelernte Entwurfsmuster (Multithread Edition)" (Teil 4)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 5)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 2)
Zusammenfassung von "In Java-Sprache erlernte Entwurfsmuster (Multi-Thread-Edition)" (Teil 1)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 12)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 8)
[Java] Zusammenfassung der Entwurfsmuster
Ein kurzer Überblick über Java, das in Klasse 4 gelernt wurde
Zusammenfassung der Grundlagen der Java-Sprache
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
Ich las Hiroshi Yuki "Einführung in Designmuster, die in Java gelernt wurden" (SB Creative)
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Zusammenfassung dessen, was ich in Spring Batch gelernt habe
Probieren Sie Designmuster in C-Sprache aus! Erinnerungsmuster - merken wir uns die Speicher der Daten
[Java] Grundlegende Zusammenfassung von Java, die nicht von Progate abgedeckt wird ~ Teil 1 ~
Was ich in Java gelernt habe (Teil 3) Anweisung zur Ausführung von Anweisungen
Zusammenfassung der Implementierung von Standardargumenten in Java
Zusammenfassung der Java-Unterstützung 2018
Zusammenfassung des Java-Entwurfsmusters
Was ich in Java gelernt habe (Teil 4) Bedingte Verzweigung und Wiederholung
Road to Java Engineer Part2 Was für eine Sprache ist Java?
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
Zusammenfassung der Java Math Klasse
[Java] Zusammenfassung der Steuerungssyntax
Java-Implementierung von Tri-Tree
Zusammenfassung der Java-Fehlerverarbeitung
[Java] Zusammenfassung der mathematischen Operationen
[Für Anfänger] Zusammenfassung des Java-Konstruktors
Grundlegende Verwendung von Java Optionaler Teil 1
Thread-sicherer Prozess in Java-Sprache
AtCoder 400 Punkte Algorithmus Zusammenfassung (Java Edition)
Liste der in Java 9 hinzugefügten Mitglieder
Liste der in Java 9 hinzugefügten Typen
Zusammenfassung der objektorientierten Programmierung mit Java
Implementierung einer ähnlichen Funktion in Java
Erstellen einer Phrasenanalyse in Java 8 (Teil 1)