Guarded Suspension模式--适合等待事件处理

2024-01-07 01:52

本文主要是介绍Guarded Suspension模式--适合等待事件处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Guarded是被守护、被保卫、被保护的意思,
Suspension则是暂停的意思。
如果执行现在的处理会造成问题,
就让执行处理的线程进行等待---
这就是Guarded Suspension模式。

模式通过让线程等待来保证实例的安全性。
一个线程ClientThread会将请求
Request的实例传递给另一个线程
ServerThread。这是一种最简单的线程
间通信。
Request        表示一个请求的类
RequestQueue   依次存放请求的类
ClientThread   发送请求的类
ServerThread。 接收请求的类
Main           测试程序行为的类

RequestQueue类
用于依次存放请求。
该类种定义了getRequest和
putRequest这两个方法。

getRequest方法会取出最先存放在
RequestQueue的一个请求,作为其返回值。
如果一个请求都没有,那就一直等待,
直到其他某个线程执行putRequest.

putRequest方法
用于添加一个请求。当线程想要向
RequestQueue种添加Request实例时
,可以调用该方法。

public class ClientThread extends Thread{private final Random random;private final RequestQueue requestQueue;public ClientThread(RequestQueue requestQueue,String name,long seed){super(name);this.requestQueue = requestQueue;this.random = new Random(seed);}public void run(){for(int i =0;i<10000;i++){Request request = new Request("No."+i);System.out.println(Thread.currentThread().getName()+" requests "+request);requestQueue.putRequest(request);try {Thread.sleep(random.nextInt(1000));} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class Request {private final String name;public Request(String name){this.name = name;}public String toString(){return "[ Request " + name +" ]";}
}
public class RequestQueue {private final Queue<Request> queue = new LinkedList<Request>();public synchronized Request getRequest() {while(queue.peek() == null) {try {wait();} catch (InterruptedException e) {}}return queue.remove();}public synchronized void putRequest(Request request){queue.offer(request);notifyAll();}
}
public class ServiceThread extends Thread {private final Random random;private final RequestQueue requestQueue;public ServiceThread(RequestQueue requestQueue,String name,long seed){super(name);this.requestQueue = requestQueue;this.random = new Random(seed);}public void run(){for(int i=0;i<10000; i++){Request request = requestQueue.getRequest();System.out.println(Thread.currentThread().getName()+" handles "+request);try{Thread.sleep(random.nextInt(1000));}catch (InterruptedException e){}}}
}

这篇关于Guarded Suspension模式--适合等待事件处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578354

相关文章

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

PyQt6 键盘事件处理的实现及实例代码

《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录一、键盘事件处理详解1、核心事件处理器2、事件对象 QKeyEvent3、修饰键处理(1)、修饰键类

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚