轻松学习多线程-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

相关文章

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

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

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

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

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

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

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

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多