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

javathread.jpeg

Zukünftiges Muster

Angenommen, Sie haben eine Methode, die lange dauert, um das Ausführungsergebnis zu erhalten. ** Holen Sie sich einen Gutschein, anstatt auf das Ausführungsergebnis zu warten **. Es dauert nicht lange, einen Gutschein zu erhalten. Der Gutschein wird zu diesem Zeitpunkt als Zukunftsrolle bezeichnet. Der Thread, der den Gutschein erhalten hat, verwendet später die Future-Rolle, um das Ausführungsergebnis zu erhalten. Wenn das Ausführungsergebnis verfügbar ist, erhalten Sie es sofort und wenn nicht, warten Sie, bis Sie können.

(Den gesamten Code finden Sie in diesem Handbuch.)

Main.java


public class Main { 
    public static void main(String[] args) { 
        ...
        Host host = new Host(); 
        Data data1 = host.request(10, 'A'); 
        Data data2 = host.request(20, 'B'); 
        Data data3 = host.request(30, 'C'); 

        try { 
            Thread.sleep(2000); 
        } catch (InterruptedException e) { 
        } 
 
        System.out.println("data1 = " + data1.getContent()); 
        System.out.println("data2 = " + data2.getContent()); 
        System.out.println("data3 = " + data3.getContent()); 
    } 
}

Host.java


public class Host { 
    public Data request(final int count, final char c) { 
        final FutureData future = new FutureData();  //Erstellen Sie einen Gutschein

        new Thread() { 
            public void run() { 
                RealData realdata = new RealData(count, c); 
                future.setRealData(realdata); 
            } 
        }.start(); 

        return future;  //Gutschein zurücksenden
    } 
}

Data.java


public interface Data { 
    public abstract String getContent(); 
}

Future.java


public class FutureData implements Data { 
    private RealData realdata = null; 
    private boolean ready = false; 
    public synchronized void setRealData(RealData realdata) { 
        if (ready) { 
            return;     // balk 
        } 
        this.realdata = realdata; 
        this.ready = true; 
        notifyAll(); 
    } 
    public synchronized String getContent() { 
        while (!ready) { 
            try { 
                wait(); 
            } catch (InterruptedException e) { 
            } 
        } 
        return realdata.getContent(); 
    } 
}

Die Host-Klasse erstellt zuerst eine Instanz von FutureData. Diese Instanz ist der Rückgabewert. Starten Sie dann einen neuen Thread und erstellen Sie eine Instanz von RealData darin. Das Erstellen einer Instanz von RealData dauert einige Zeit. Rufen Sie nach dem Erstellen der Instanz die setRealData-Methode auf, um sie in der FutureData-Instanz festzulegen.

Die FureData-Klasse ist eine Gutscheinklasse. Das Feld realData ist ein Feld, das eine Instanz von RealData enthält, die erstellt wird. Dieses Feld wird von der setRealData-Methode zugewiesen. Die getContent-Methode ist eine Methode zum Abrufen der tatsächlichen Daten. Warten Sie, bis die Realdaten von setRealData festgelegt wurden. Wenn es gesetzt ist, kehrt es sofort zurück und wenn es nicht gesetzt ist, wartet es. Wartende Threads werden durch den Aufruf von notifyAll in setRealData geweckt.

Charakter

Kundenrolle Die Client-Rolle stellt eine Anforderung an die Host-Rolle und erhält als Ergebnis sofort die VirtualData-Rolle (Rückgabewert). Die hier empfangene VirtualData-Rolle ist eigentlich die Future-Rolle. Die Client-Rolle muss nicht wissen, ob der Rückgabewert eine RealData-Rolle oder eine Future-Rolle ist. Im Beispielprogramm spielte die Hauptklasse diese Rolle.

Host-Rolle Die Host-Rolle erstellt einen neuen Thread und beginnt mit der Erstellung der RealData-Rolle. Andererseits gibt die Rolle des Clients die Rolle der Zukunft als die Rolle der virtuellen Daten zurück. Im Beispielprogramm spielte die Host-Klasse diese Rolle.

Rolle für virtuelle Daten Die VirtualData-Rolle ist eine Rolle, die die Future-Rolle mit der RealData-Rolle gleichsetzt. Im Beispielprogramm spielte die Datenschnittstelle diese Rolle.

Real Data Rolle Die RealData-Rolle ist eine Rolle, die tatsächliche Daten darstellt. Das Erstellen dieses Objekts dauert einige Zeit. Im Beispielprogramm spielte die RealData-Klasse diese Rolle.

Zukünftige Rolle Die Future-Rolle ist eine Rolle, die von der Host-Rolle an die Client-Rolle als Gutschein für die RealData-Rolle übergeben wird. Die Future-Rolle verhält sich als Virtual Data-Rolle für die Client-Rolle. Bei der Bedienung über die Client-Rolle wartet der Thread mit Wartezeit, bis die RealData-Rolle abgeschlossen ist. Im Beispielprogramm spielte die FureData-Klasse diese Rolle.

Tipps zur Erweiterung Ihrer Gedanken

Die Rolle der Zukunft, die nicht warten kann Es ist auch möglich, die Methode getContent asynchron zu implementieren. Anstelle der verwirrenden Geschichte, einen neuen Thread in der getContent-Methode zu erstellen, können Sie das Balking-Muster verwenden, um "nach Hause zu gehen, wenn Sie nicht können".

Rückruf und Zukunftsmuster Wenn Sie auf den Abschluss der Verarbeitung warten und den Rückgabewert erhalten möchten, können Sie sich eine Methode namens ** Rückruf ** vorstellen. Callback ist eine Methode, bei der der von der Host-Rolle nach Abschluss der Verarbeitung gestartete Thread die Methode der Client-Rolle zurückruft.


Beziehung Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 1) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 2) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 3) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 4) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 5) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 6) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded 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)

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 11)
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)