Le modèle de suspension surveillée a des noms tels que ** attente surveillée ** et ** verrouillage de rotation **.
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(); //Attendez lorsque la file d'attente est vide(Entrez le jeu de poids)
} catch (InterruptedException e) {
}
}
return queue.remove();
}
public synchronized void putRequest(Request request) {
queue.offer(request);
notifyAll(); //Notifier au thread en attente qu'une demande a été placée dans la file d'attente
}
}
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();
}
}
Résultat d'exécution
...
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 transmet une instance de Request à SeverThread. Il s'agit d'une ** communication inter-thread ** très simple. ClientThread et ServerThread sont appelés ** objets actifs **, et RequestQueue est appelé ** objets passifs **.
ClientThread lance une requête à Queue (put) et ServerThread récupère une requête de Queue (get). put et get sont synchronisés et exclusifs.
La méthode getReques récupère l'une des requêtes les plus anciennes. S'il n'y a pas de demandes, attendez qu'un autre thread fasse une putRequest. La condition queue.peek ()! = Null, c'est-à-dire la condition que la file d'attente n'est pas vide, doit être remplie. Une telle condition qui doit être satisfaite est appelée une ** condition de garde ** du modèle de suspension protégée.
La méthode putRequest ajoute une requête. Puis notifiez le thread d'attente avec notifyAll.
Pour attendre et notifier Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 1) Voir.
Comme le montre le résultat de l'exécution, B (get) ne dépasse pas A (put).
Le rôle GuardedObject est une classe qui a une méthode protégée. Si la condition de garde est remplie, elle sera exécutée immédiatement et si elle n'est pas remplie, elle sera maintenue en attente. Le rôle GuardedObjec peut avoir un stateChangingMethod qui modifie l'état de l'instance. Dans l'exemple de programme, la classe RequestQueue joue ce rôle, getRequest correspond à guardedMethod et putRequest correspond à stateChangingMethod.
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)
Recommended Posts