Guarded Suspension模式简单实现
Guarded Suspension 意为保护暂停,假设服务器很短时间内承受大量的客户端请求,客户端请求的数量超过服务器本身的即时处理能力,而服务器又不能丢弃任何一个客户端请求,此时可以让客户端的请求进行排队,由服务端程序一个接一个处理,保证了所有的客户端请求均不丢失,同时避免了服务器由于同时处理太多的请求崩溃
主要角色:
- Request:客户端请求
- RequestQueue:客户端请求队列
- ClientThread: 客户端进程
- ServerThread: 服务器进程
/**
* 请求的内容
*/
public class Request {
   private String name;
   public Request(String name) {
       this.name = name;
   }
   public String getName() {
       return name;
   }
   @Override
   public String toString() {
       return "Request{" +
               "name='" + name + '\'' +
               '}';
   }
}
import java.util.LinkedList;
public class RequestQueue {
    private LinkedList queue = new LinkedList();
    public synchronized Request getRequest(){
        while (queue.size()==0){
            try {
                wait(); //等待新的Request
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return (Request) queue.remove(); //返回Request队列中的第一个请求
    }
    public synchronized void addRequest(Request request){
        queue.add(request); //添加Request请求
        notifyAll(); //通知getRequest()
    }
}
public class ClientThread extends Thread {
    private RequestQueue requestQueue;
    public ClientThread(RequestQueue requestQueue,String name) {
        super(name);
        this.requestQueue = requestQueue;
    }
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) { //此次i<3为了输出少量结果
            //构造请求
            Request request = new Request("RequestId:" + i + " Thread_Name:" + Thread.currentThread().getName());
            System.out.println(Thread.currentThread().getName()+" addRequest "+request);
            requestQueue.addRequest(request); //提交请求
            try {
                Thread.sleep(10); //客户端耗时操作,速度快于服务端处理速度
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ClientThread Name is:"+Thread.currentThread().getName());
        }
        System.out.println(Thread.currentThread().getName()+" 请求完成");
    }
}
public class ServerThread extends Thread {
    private RequestQueue requestQueue;
    public ServerThread(RequestQueue requestQueue,String name) {
        super(name);
        this.requestQueue = requestQueue;
    }
    @Override
    public void run() {
        while (true){
            final Request request = requestQueue.getRequest(); //得到请求
            try {
                Thread.sleep(100);//模拟请求耗时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+" handles "+request);
        }
    }
}
public class Main {
    public static void main(String[] args){
        RequestQueue requestQueue = new RequestQueue(); //  请求队列
        for (int i = 0; i < 1; i++) {
            new ServerThread(requestQueue,"ServerThread "+i).start();
        }
        for (int i = 0; i < 1; i++) {
            new ClientThread(requestQueue,"ClientThread "+i).start();
        }
    }
    //ClientThread 0 addRequest Request{name='RequestId:0 Thread_Name:ClientThread 0'}
    //ClientThread Name is:ClientThread 0
    //ClientThread 0 addRequest Request{name='RequestId:1 Thread_Name:ClientThread 0'}
    //ClientThread Name is:ClientThread 0
    //ClientThread 0 addRequest Request{name='RequestId:2 Thread_Name:ClientThread 0'}
    //ClientThread Name is:ClientThread 0
    //ClientThread 0 请求完成
    //ServerThread 0 handles Request{name='RequestId:0 Thread_Name:ClientThread 0'}
    //ServerThread 0 handles Request{name='RequestId:1 Thread_Name:ClientThread 0'}
    //ServerThread 0 handles Request{name='RequestId:2 Thread_Name:ClientThread 0'}
}
Guarded Suspension模式简单实现的更多相关文章
- 多线程系列之四:Guarded Suspension 模式
		一,什么是Guarded Suspension模式如果执行现在的处理会造成问题,就让执行处理的线程等待.这种模式通过让线程等待来保证实例的安全性 二,实现一个简单的线程间通信的例子 一个线程(Clie ... 
- 并发设计模式之Guarded Suspension模式
		- 原文链接: http://www.joyhwong.com/2016/11/19/并发设计模式之guarded-suspension模式/ Guarded Suspension意为保护暂停,其核心 ... 
- 并行模式之Guarded Suspension模式
		并行模式之Guarded Suspension模式 一).Guarded Suspension: 保护暂存模式 应用场景:当多个客户进程去请求服务进程时,客户进程的请求速度比服务进程处里请求的速度快, ... 
- 多线程程序设计学习(4)guarded suspension模式
		Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者 1.1该 ... 
- 多线程同步循环打印和Guarded suspension 模式
		* 迅雷笔试题: * 有三个线程ID分别是A.B.C,请有多线编程实现,在屏幕上循环打印10次ABCABC… 由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步. 线程同步有两种 ... 
- 多线程学习之三生产者消费者模式Guarded Suspension
		Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者 1.1该 ... 
- Guarded Suspension Pattern【其他模式】
		Guarded Suspension Pattern public class GuardedSuspension { /** * Guarded Suspension Pattern[保护悬挂模式] ... 
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
		一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ... 
- 分布式系统的消息&服务模式简单总结
		分布式系统的消息&服务模式简单总结 在一个分布式系统中,有各种消息的处理,有各种服务模式,有同步异步,有高并发问题甚至应对高并发问题的Actor编程模型,本文尝试对这些问题做一个简单思考和总结 ... 
随机推荐
- Kettle数据同步速度调优记录
			Msyql到Vertica 1.mysql中在openshop 数据库中选择其中一个300W左右数据的表 create table ip_records_tmp_01 AS SELECT * FROM ... 
- SSH配置与修改
			ssh文件路径:/etc/ssh/ ssh的日志文件:/var/log/secure 端口修改:./sshd_config 服务启停: service sshd start/stop/restart ... 
- Appium API文档中文版
			传送门 https://testerhome.com/topics/3144 
- [原创] Delphi 修改新建窗体时候的默认字体格式
			Delphi 修改新建窗体时候的默认字体格式 操作步骤: 1.运行输入“regedit” 2.找到目录(这里默认以Delphi 7为例) HKEY_CURRENT_USER\Software\Borl ... 
- modelviewset 中的序列化方法怎么用
- linux0.11内核源码——进程各状态切换的跟踪
			准备工作 1.进程的状态有五种:新建(N),就绪或等待(J),睡眠或阻塞(W),运行(R),退出(E),其实还有个僵尸进程,这里先忽略 2.编写一个样本程序process.c,里面实现了一个函数 /* ... 
- 51nod 1518 稳定多米诺覆盖(容斥+二项式反演+状压dp)
			[传送门[(http://www.51nod.com/Challenge/Problem.html#!#problemId=1518) 解题思路 直接算不好算,考虑容斥,但并不能把行和列一起加进去容斥 ... 
- CTF | bugku | 秋名山车神
			''' @Modify Time @Author ------------ ------- 2019/8/31 19:55 laoalo ''' import requests from lxml i ... 
- feignClient传参(参数为对象类型)的一个坑
			客户端 @RequestMapping(value = "/friendCircleComment/comment",method = RequestMethod.POST) R ... 
- centos7运行yum报如下提示:Run "yum repolist all" to see the repos you have
			centos7运行yum报如下提示: There are no enabled repos. Run "yum repolist all" to see the repos you ... 
