图解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();
    }
}
控制台输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值