图解java多线程设计模式学习第三章Guarded Suspension
Guarded是被守护的意思,Suspension表示等待。如果执行现在的处理会造成问题,就让执行处理的线程进行等待,这就是Guarded Suspension模式。举一个例子:客户端不断的发送请求,服务端不停地接受请求,并且服务端处理请求的顺序是FIFO,先进来的先处理,没有请求则等待。
package GuardeSuspension;
public class Request {private final String name;
public Request(String name){
this.name = name;
}
@Override
public String toString() {
return "Request [name=" + name + "]";
}
}
package GuardeSuspension;
import java.util.LinkedList;
import java.util.Queue;
public class RequestQueue {
private final Queue<Request> queue = new LinkedList<>();
/**
*
* @return
*/
public synchronized Request getRequest(){
//queue.peek() 获取队列里的头一个元素,不删除这个元素
while (queue.peek() == null) {
try {
wait();
} catch (Exception e) {
// TODO: handle exception
}
}
//queue.remove() 删除队列里的头一个元素,并且返回删除的这个元素
return queue.remove();
}
public synchronized void putRequest(Request request){
// queue.offer(request) 往队列里的末尾添加一个元素
queue.offer(request);
notifyAll();
}
}
package GuardeSuspension;
import java.util.Random;
public class ClientThread extends Thread{
private final Random random;
private RequestQueue requestQueue;
public ClientThread(RequestQueue requestQueue,String name, Long seed) {
this.random = new Random(seed);
this.requestQueue = requestQueue;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 1000; i++) {
Request request = new Request("No." + i);
System.out.println(Thread.currentThread().getName() + " request " + request);
try {
requestQueue.putRequest(request);
Thread.sleep(random.nextInt(1000));
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
package GuardeSuspension;
import java.util.Random;
public class ServerThread extends Thread{
private final Random random;
private final RequestQueue requestQueue;
public ServerThread(RequestQueue requestQueue,String name, long seed) {
super(name);
this.random = new Random(seed);
this.requestQueue = requestQueue;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 1000; i++) {
Request request = requestQueue.getRequest();
System.out.println(Thread.currentThread().getName() + " handles " + request);
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
测试代码:
package GuardeSuspension;
public class Client {
public static void main(String[] args) {
RequestQueue requestQueue = new RequestQueue();
new ClientThread(requestQueue, "张三", 3000000L).start();
new ServerThread(requestQueue, "李四", 6000000L).start();
}
}
控制台输出: