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

javathread.jpeg

Geschütztes Aufhängungsmuster

Das Guarded Suspension-Muster enthält Namen wie ** Guarded Wait ** und ** Spin Lock **.

Request.java


public class Request {
     private final String name;
     public Request(String name) {
         this.name = name;
     }
     public String getName() {
         return name;
     }
     public String toString() {
         return "[ Request " + name + " ]";
     }
}

RequestQueue.java


import java.util.Queue;
import java.util.LinkedList;

public class RequestQueue {
    private final Queue<Request> queue = new LinkedList<Request>();
    public synchronized Request getRequest() {
        while (queue.peek() == null) {
            try {
                wait(); //Warten Sie, wenn die Warteschlange leer ist(Geben Sie das eingestellte Gewicht ein)
            } catch (InterruptedException e) {
            }
        }
        return queue.remove();
    }
    public synchronized void putRequest(Request request) {
        queue.offer(request);
        notifyAll(); //Benachrichtigen Sie den wartenden Thread, dass eine Anforderung in die Warteschlange gestellt wurde
    }
}

ClientThread.java


import java.lang.Math;

public class ClientThread extends Thread {
    private final RequestQueue requestQueue;
    public ClientThread(RequestQueue requestQueue, String name) {
        super(name);
        this.requestQueue = requestQueue;
    }
    public void run() {
        for (int i = 0; i <= 100; i++) {
            Request request = new Request("No." + i);
            System.out.println(Thread.currentThread().getName() + " put " + request);
            requestQueue.putRequest(request);
            try {
                Thread.sleep((int)(Math.random()*10));
            } catch (InterruptedException e) {
            }
        }
    }
}

ServerThread.java


import java.lang.Math; 
 
public class ServerThread extends Thread { 
    private final RequestQueue requestQueue; 
    public ServerThread(RequestQueue requestQueue, String name) { 
        super(name); 
        this.requestQueue = requestQueue; 
    } 
    public void run() { 
        for (int i = 0; i <= 100; i++) { 
            Request request = requestQueue.getRequest(); 
            System.out.println(Thread.currentThread().getName() + " get " + request); 
            try { 
                Thread.sleep((int)(Math.random()*10)); 
            } catch (InterruptedException e) { 
            } 
        } 
    } 
}

Main.java


public class Main { 
    public static void main(String[] args) { 
        RequestQueue requestQueue = new RequestQueue(); 
        new ClientThread(requestQueue, "A").start(); 
        new ServerThread(requestQueue, "B").start(); 
    } 
}

Ausführungsergebnis


...
A put [ Request No.95 ]
B get [ Request No.91 ]
B get [ Request No.92 ]
A put [ Request No.96 ]
A put [ Request No.97 ]
B get [ Request No.93 ]
A put [ Request No.98 ]
B get [ Request No.94 ]
A put [ Request No.99 ]
B get [ Request No.95 ]
B get [ Request No.96 ]
B get [ Request No.97 ]
B get [ Request No.98 ]
B get [ Request No.99 ]
...

ClientThread übergibt eine Instanz der Anforderung an SeverThread. Dies ist eine sehr einfache ** Kommunikation zwischen Threads **. ClientThread und ServerThread heißen ** aktive Objekte ** und RequestQueue heißt ** passive Objekte **.

ClientThread sendet eine Anfrage an Queue (put) und ServerThread ruft eine Anfrage aus Queue (get) ab. put and get sind synchronisiert und exklusiv.

Die Methode getReques ruft eine der ältesten Anforderungen ab. Wenn keine Anforderungen vorhanden sind, warten Sie, bis ein anderer Thread eine putRequest erstellt. Die Bedingung queue.peek ()! = Null, dh die Bedingung, dass die Warteschlange nicht leer ist, muss erfüllt sein. Eine solche Bedingung, die erfüllt sein muss, wird als ** Schutzbedingung ** des Guarded Suspension-Musters bezeichnet.

Die putRequest-Methode fügt eine Anforderung hinzu. Benachrichtigen Sie dann den wartenden Thread mit notifyAll.

Warten und benachrichtigen Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 1) Sehen.

Wie das Ausführungsergebnis zeigt, überholt B (get) A (put) nicht.

Charakter

Die GuardedObject-Rolle ist eine Klasse mit einer geschützten Methode. Wenn die Schutzbedingung erfüllt ist, wird sie sofort ausgeführt, und wenn sie nicht erfüllt ist, wird sie warten gelassen. Die GuardedObjec-Rolle verfügt möglicherweise über eine stateChangingMethod, die den Status der Instanz ändert. Im Beispielprogramm spielt die RequestQueue-Klasse diese Rolle, getRequest entspricht guardedMethod und putRequest entspricht stateChangingMethod.


Beziehung Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 1) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded 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)

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)
Java-Entwurfsmuster
Was ich in Java gelernt habe (Teil 2) Was sind Variablen?
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
[Java] Grundlegende Zusammenfassung von Java, die nicht von Progate abgedeckt wird ~ Teil 2 ・ Liste ~
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
Was ich in Java gelernt habe (Teil 1) Java-Entwicklungsablauf und Überblick
Zusammenfassung von ORM "uroboroSQL", das in Enterprise Java verwendet werden kann
[Für Anfänger] Zusammenfassung des Java-Konstruktors
Zusammenfassung des Pakets [Java Silver Study]
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
Führen Sie eine Phrasenanalyse in Java 8 durch (Teil 2).
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)