轻松学习多线程-04-Guarded Suspension 模式

2023-10-22 06:32

本文主要是介绍轻松学习多线程-04-Guarded Suspension 模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Guarded Suspension 模式

Guarded Suspension 模式通过让线程等待保证线程的安全性。

实际案例

类信息概览:

类名说明
Main.java方法的总入口
ClientThread.java发送请求的类
ServerThread.java接受请求的类
RequestQueue.java依次存放请求的类
Request.java标识一个请求的类

定义

  • ClientThread.java
package com.github.houbb.thread.learn.easy.learn.guarded.suspension;import java.util.Random;public class ClientThread extends Thread {private final Random random;private final RequestQueue requestQueue;public ClientThread(RequestQueue requestQueue, final String name, final long seed) {super(name);this.requestQueue = requestQueue;random = new Random(seed);}@Overridepublic void run() {for(int i = 0; i < 10; i++) {Request request = new Request("No. " + i);requestQueue.putRequest(request);System.out.println(Thread.currentThread().getName() + " put " + request);try {Thread.sleep(random.nextInt(1000));} catch (InterruptedException e) {e.printStackTrace();}}}}
  • ServerThread.java
package com.github.houbb.thread.learn.easy.learn.guarded.suspension;import java.util.Random;public class ServerThread extends Thread {private final Random random;private final RequestQueue requestQueue;public ServerThread(RequestQueue requestQueue, final String name, final long seed) {super(name);this.requestQueue = requestQueue;random = new Random(seed);}@Overridepublic void run() {for(int i = 0; i < 10; i++) {Request request = requestQueue.getRequest();System.out.println(Thread.currentThread().getName()+" get "+request);try {Thread.sleep(random.nextInt(1000));} catch (InterruptedException e) {e.printStackTrace();}}}}
  • RequestQueue.java
package com.github.houbb.thread.learn.easy.learn.guarded.suspension;import java.util.LinkedList;
import java.util.Queue;public class RequestQueue {private Queue<Request> requestQueue = new LinkedList<>();/*** 获取一个对象* 1. 如果队列为空,则一直等待。* @return*/public synchronized Request getRequest() {while(requestQueue.peek() == null) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}// Retrieves and removes the head of this queue.return requestQueue.remove();}/*** 放置一个对象* @param request*/public synchronized void putRequest(Request request) {requestQueue.add(request);notifyAll();}}
  • Request.java
package com.github.houbb.thread.learn.easy.learn.guarded.suspension;/*** 请求参数* @version 1.0.0* @author bbhou* @since 1.0.0*/
public class Request {private final String name;public Request(String name) {this.name = name;}public String getName() {return name;}@Overridepublic String toString() {return "Request{" +"name='" + name + '\'' +'}';}
}

测试

  • Main.java
package com.github.houbb.thread.learn.easy.learn.guarded.suspension;public class Main {public static void main(String[] args) {RequestQueue requestQueue = new RequestQueue();new ClientThread(requestQueue, "CLIENT", 10000L).start();new ServerThread(requestQueue, "SERVER", 20000L).start();}}
  • 测试结果
CLIENT put Request{name='No. 0'}
SERVER get Request{name='No. 0'}
CLIENT put Request{name='No. 1'}
SERVER get Request{name='No. 1'}
CLIENT put Request{name='No. 2'}
CLIENT put Request{name='No. 3'}
SERVER get Request{name='No. 2'}
SERVER get Request{name='No. 3'}
CLIENT put Request{name='No. 4'}
CLIENT put Request{name='No. 5'}
SERVER get Request{name='No. 4'}
CLIENT put Request{name='No. 6'}
CLIENT put Request{name='No. 7'}
SERVER get Request{name='No. 5'}
CLIENT put Request{name='No. 8'}
SERVER get Request{name='No. 6'}
CLIENT put Request{name='No. 9'}
SERVER get Request{name='No. 7'}
SERVER get Request{name='No. 8'}
SERVER get Request{name='No. 9'}

实现方式

UML & Code

UML

UML 图示如下

UML

Code

代码地址

Guarded Suspension

系列导航

多线程系列导航

这篇关于轻松学习多线程-04-Guarded Suspension 模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Go语言实现桥接模式

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

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

Java轻松实现在Excel中插入、提取或删除文本框

《Java轻松实现在Excel中插入、提取或删除文本框》在日常的Java开发中,我们经常需要与Excel文件打交道,当涉及到Excel中的文本框时,许多开发者可能会感到棘手,下面我们就来看看如何使用J... 目录Java操作Excel文本框的实战指南1. 插入Excel文本框2. 提取Excel文本框内容3

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. 流模式传统文件方式 (非流式)流

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性