并发设计模式之guardedsuspension模式

zzfx zzfx     2022-10-11     470

关键词:

- 原文链接: http://www.joyhwong.com/2016/11/19/并发设计模式之guarded-suspension模式/

Guarded Suspension意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务。设想一种场景,服务器可能会在很短时间内承受大量的客户端请求,客户端请求的数量可能超过服务器本身的即时处理能力,而服务端程序又不能丢弃任何一个客户请求。此时,最佳的处理方案莫过于让客户端要求进行排队,由服务端程序一个接一个处理。这样,既保证了所有的客户端请求均不丢失,同时也避免了服务器由于同时处理太多的请求而崩溃

1.Guarded Suspension模式的结构

Guarded Suspension模式的主要成员有:Request、RequestQueue、ClientThread、 ServerThread

  • Request:表示客户端请求
  • RequestQueue:用于保存客户端请求队列
  • ClientThread:客户端进程
  • ServerThread:服务器进程

其中,ClientThread负责不断发起请求,并将请求对象放入请求队列。ServerThread则根据其自身的状态,在有能力处理请求时,从RequestQueue中提取请求对象加以处理。系统的工作流程如图

技术分享图片

从流程图中可以看到,客户端的请求数量超过了服务线程的能力。在频繁的客户端请求中,RequestQueue充当了中间缓存,存放未处理的请求,保证了客户请求不丢失,同时也保护了服务线程不会受到大量并发的请求,而导致计算机资源不足

2. Guarded Suspension模式的简单实现

Request类封装了请求的内容

package com.joyhwong;

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 + " ]"; 
	}
}

RequestQueue对象作为Request的集合,维护系统的Request请求列表

package com.joyhwong;

import java.util.LinkedList;

public class RequestQueue {
	private LinkedList<Request> queue = new LinkedList<>();
	public synchronized Request getRequest() {
		while (queue.size() == 0) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		return queue.removeFirst();
	}
	
	public synchronized void addRequest(Request request) {
		queue.add(request);
		notifyAll();
	}
}

服务端进程用于处理用户的请求操作,代码实现如下

package com.joyhwong;

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);
		}
	}
}

客户端的请求发起进程代码实现如下

package com.joyhwong;

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 < 10; i++) {
			Request request = new Request("RequestID: " + i + " Thread_Name: " + Thread.currentThread().getName());
			System.out.println(Thread.currentThread().getName() + " requests " + 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() + "request end");
	}
}

主函数如下

package com.joyhwong;

public class Main {
	public static void main(String[] args) {
		RequestQueue requestQueue = new RequestQueue();
		for (int i = 0; i < 10; i++) {
			new ServerThread(requestQueue, "ServerThread" + i).start();
		}
		
		for (int i = 0; i < 10; i++) {
			new ClientThread(requestQueue, "ClientThread" + i).start();
		}
	}
}

 

实战并发编程-10guardedsuspension模式在blockingqueue源码中应用

文章目录PreAnotherCase源码分析概继承关系核心方法非阻塞式方法(offer、add)offer(Ee)add(Ee)阻塞式方法(put(Ee)/take(Ee))总结Pre实战并发编程-08基 查看详情

实战并发编程-09多线程guardedsuspension模式案例实战

文章目录需求Code(上)【1、init初始化报警服务】【2、onConnected方法建立连接】【3、HeartbeatTask心跳检查】【4、tesConnection测试是否连接正常】【5、onDisconnected断开连接】【6、reConnected重新连接】承上启下Code(下)[1、sendAlarm发... 查看详情

day850.guardedsuspension模式-java并发编程实战(代码片段)

GuardedSuspension模式Hi,我是阿昌,今天学习记录的是关于GuardedSuspension模式的内容。小灰工作中遇到一个问题,开发了一个Web项目:Web版的文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。... 查看详情

多线程系列之四:guardedsuspension模式(代码片段)

一,什么是GuardedSuspension模式如果执行现在的处理会造成问题,就让执行处理的线程等待。这种模式通过让线程等待来保证实例的安全性二,实现一个简单的线程间通信的例子一个线程(ClientThread)将请求(Request)的实例传递给另外... 查看详情

juc并发编程多线程设计模式--同步模式之保护性暂停(定义&实现&带超时版guardedobject)(代码片段)

1.定义即GuardedSuspension,用在一个线程等待另一个线程的执行结果要点:有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生... 查看详情

多线程设计模式-全面详解(学习总结---从入门到深化)

...;​​​​AutoSaveThread ​​​​DocumentEditThread​​​​GuardedSuspension设计模式​​​​什么是Guarded Suspension设计模式​​​​ GuardedSuspension的示例​​​​ Latch设计模式​​​​TwoPhase Termination设计模式​​​​... 查看详情

day850.guardedsuspension模式-java性能调优实战(代码片段)

GuardedSuspension模式Hi,我是阿昌,今天学习记录的是关于GuardedSuspension模式的内容。小灰工作中遇到一个问题,开发了一个Web项目:Web版的文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。... 查看详情

群“模”乱舞之简单工厂模式

...体会乐与怒的程序人生中值得回味的一幕幕。——《大话设计模式》        能把计算机编程类的书写成小说一样的效果,是这本书的最大亮点,也是我最为敬佩的地方。拿到书之后,爱不释手。用了... 查看详情

折腾java设计模式之解释器模

解释器模式解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。意图给定一个语言,定义它的文法表示,并... 查看详情

并行程序设计模式-master-worker模式-guardedsuspension模式-不变模式-生产者-消费者模式的理解

1、Master-Worker模式  (1)、定义理解:    Master-Worker是将串行处理,变为并行处理。有很多的Worker处理串行任务获得子结果集,那么需要个Master来处理这些子结果集,获取和串行相同的结果集。   (2)、角色有     Wo... 查看详情

高并发高可用架构设计之目录

简介架构图 查看详情

高并发高可用架构设计之目录

简介架构图 查看详情

单例模式之懒汉的并发问题

饿汉模式:classSingle{  privatestaitcfinalSingles=newSingle();  privateSingle(){}  publicstaticSinglegetSingle(){    returns;  }}  懒汉模式:classSingle{  privatestaticSingles=null;  privateSingle(){}  publicst 查看详情

性能测试之场景设计

负载测试需求举例:系统支持200个并发,用户信息查询的响应时间小于5秒场景设计:200个并发持续运行20分钟,通过测试结果验证用户信息查询的响应时间是否小于5秒。 压力测试需求举例:系统在50,100,150,200并发下的运... 查看详情

互联网三高设计之高并发

一、什么是​高并发​高并发(HighConcurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。高并发相关常用的一些指标有响应时间(ResponseTime),吞吐量(Thr... 查看详情

day851.balking模式-java并发编程实战(代码片段)

...式本质上是一种规范化地解决“多线程版本的if”的方案GuardedSuspension模式可以用“多线程版本的if”来理解,不同于单线程中的if,这个“多线程版本的if”是需要等待的,而且还很执着,必须要等到条件为真。但 查看详情

并发设计模式之生产者消费者设计模式

主函数:1packagecom.ietree.basicskill.mutilthread.designpattern.ProducerConsumer;23importjava.util.concurrent.BlockingQueue;4importjava.util.concurrent.ExecutorService;5importjava.util.concurrent.Executor 查看详情

多线程编程-设计模式之保护性暂挂(guardedsuspesion)模式

GuardedSuspension模式的架构核心是一个受保护方法(GuardedMethod).该方法需要执行其所要真正执行的操作时需要满足特定的条件(Predicate,以下称之为保护条件)。当该条件不满足时,执行受保护方法的线程会被挂起进入等待状态... 查看详情