Java多线程模式之Guarded Suspension Pattern

Guarded Suspension Pattern:保护暂停模式


 设计方法
  1。施加条件加以防卫
  2。区分等待和不等待的情况
  3。执行wait等待条件的变化


 参与者
  GuardedObject:被防卫的对象,有2个方法
   guardedMethod方法
    满足警戒条件时,马上执行
    不满足警戒条件时,等待
   stateChangingMethod方法
    更改警戒条件

import java.util.Random;

public class ClientThread extends Thread {
    private Random random;
    private 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) {
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        RequestQueue requestQueue = new RequestQueue();
        new ClientThread(requestQueue, "Alice", 3141592L).start();
        new ServerThread(requestQueue, "Bobby", 6535897L).start();
    }
}

public class Request {
    private final String name;
    public Request(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public String toString() {
        return "[ Request " + name + " ]";
    }
}


import java.util.LinkedList;

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

import java.util.Random;

public class ServerThread extends Thread {
    private Random random;
    private RequestQueue requestQueue;
    public ServerThread(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) {
            }
        }
    }
}

 

1. 将while改成if条件的问题

2.synchronized的范围只有wait

3.try..catch放在while 的外面

4.以Thread.sleep代替wait

    

多线程设计模式——Guarded Suspension(保护性暂挂模式) 这些都是根据我最近看的《Java实战指南多线程编程(设计模式篇)》所得整理。模式名称Guarded Suspension(保护性暂挂模式)模式面对的问题多线程编程中,往往将一个任务分解为不同的部分,将其交由不同的线程来执行,这些线程相互协作的时候,会出现一个线程等待另一个线程一定操作过后才能进行的情景,这个时候就需要这个线程退出执行。解决方法有一个类GuardedObject包含受保护方法的对象,存 阅读详情

相关推荐

AntV G6边动画实战:手把手教你实现数据流向箭头与虚线流动效果

本文详细解析了如何使用AntV G6实现数据流向箭头与虚线流动效果,通过自定义边动画提升数据可视化的动态表现力。从基础环境搭建到核心概念讲解,再到虚线流动动画和箭头路径动画的具体实现与参数调控,帮助开发者掌握G6边动画的高级技巧,适用于网络流量监控、数据传递等场景。

weixin_28487433的博客 264

并发设计模式——保护性暂停(Guarded Suspension)

一种简单基础的并发设计模式——保护性暂停模式

m0_56642345的博客 861

手把手教你用STM32F103的普通IO口读取SSI编码器(附完整代码与示波器调试心得)

本文详细介绍了如何利用STM32F103的普通IO口读取SSI绝对式编码器数据,提供完整的硬件连接方案、精确时序控制的软件实现及示波器调试技巧。通过低成本方案实现高精度位置反馈,适用于工业自动化和机器人控制领域。

weixin_29172963的博客 452

Guarded Suspension模式

Guarded Suspension 模式 考虑一个场景,当两个服务通过MQ进行交互时,服务A生产消息,服务B消费消息,两者为异步操作,我们如何来保证A消费到B返回的结果呢? Guarded Suspension模式 所谓 Guarded Suspension,直译过来就是“保护性地暂停”。 Guarded Suspension模式的结构图如下,其中包含: 一个受保护的对象GuardedObject 两个成员方法:get(Predicate p) 和 onChanged(T obj)方法 Guard

HuangGang_clown的博客 659

RTT Studio和Cubemx联合开发

1. RTT studio创建工程 创建工程 ## 创建完成以后的目录结构 2. 配置CubuMx 双击cubumx的图标打开CubeMx 配置时钟 生成代码 构建后的代码结构 编译代码满屏错误:不要慌 3. 新增脚本 新建scons脚本文件 SConscript 脚本内容如下 import os from building import * cwd = GetCurrentDir() src = Glob('*.c') # add cubemx drivers src = Split('''

Car12 1563

多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)

多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)

1450

MMCVDeformConv2d转TensorRT记录

MMCVDeformConv2d转Tensorrt

qq_35435798的博客 1778

保护性暂停设计模式

答案是不行的,还要考虑虚假唤醒的情况就比如它在00:00s开始获取结果,timeout=2s,在00:01s时候被唤醒,求得经历时间为1s,再次循环之后passTime>=timeout不成立,然后就会接着在等timeout(2s),但是按理说我们再等待1s就可以了,这样的话你就多等了.写了一个测试类,用来对保护性暂停设计模式进行测试.一个线程A用来接收下载结果,另外一个线程B执行完下载(DownLoader类用于下载百度首页)之后,将下载结果传入,线程A就可以获取到结果然后进行结果的打印.

欢迎来到我的博客,在这里我会用我的方式来讲解知识,请大家多多关照 804

【产品经理修炼之道】-如何搭建企业级账务系统?

笔者公司的业务模式具有一定的独特性,不同于我们常见的市面上供应链类公司的进销存模式。公司主要为各大银行和金融机构提供信贷领域的风控服务,客户主要通过请求公司的数据产品接口产生费用,可以简单地理解为请求一次接口收费0.5元,一个月若是有1w人请求同一个接口则公司需要收费5000元。

xiaoli8748的专栏 5404

Oracle EBS的帐套由“4C”构成,而华为MetaERP将其发展为“6C”

华为MetaERP从OracleEBS的"4C"架构升级为"6C",实现核算理念革新。核心突破在于将会计科目、核算维度和核算单元解耦,形成"科目表+维度库"的灵活架构。新架构优势显著:1)科目回归会计本质,管理维度独立扩展;2)支持无限维度的精细化核算;3)实现数据权限隔离和内部交易自动化;4)采用元数据驱动设计,为AI应用奠定基础。这一平台化架构解决了大型企业在全球化、多元化发展中的核算难题,相比传统架构具有更强的灵活性和扩展性。

金牌架构师 203

《java多线程设计模式 第三章Guarded Suspension Pattern》

public class Request { private final String name; public Request(String name) { this.name = name; } public String getName() { return name; } public String toString() { return "[

木工之路 1601

AI 辅助编程全景:演进、提效场景与未来趋势

本文系统梳理了AI辅助编程的发展历程与应用场景。演进路径分为三代:从代码补全工具(2023)、对话式助手(2024)到自主编程代理(2025)。在软件全生命周期中,AI可显著提升各环节效率:需求分析阶段节省30-60%文档编写时间;设计阶段缩短40-60%技术调研周期;编码阶段通过智能补全提升55%任务速度;测试阶段减少30-60%测试编写时间。数据显示,2025年84%开发者使用AI工具,41%代码由AI生成,平均每周节省3.6小时。AI正推动开发者角色从编写者转变为审核者,但复杂业务逻辑和架构设计仍需人

甘蓝的专栏 472

java多线程系列之模式|第一篇-Guarded Suspension pattern

多线程开发之Guarded Suspension pattern模式 作者注:该系列文章基于《java线程设计模式》撰写,只用于学习和交流。 简介 多线程运行,当前线程没有达到警戒条件时,线程会进入等待直到被唤醒。 ...

不争朝夕 375

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JAVA多线程设计模式三 Guarded Suspension Pattern

一定要满足的条件  Guard Condition ,警戒条件。   public class Request { private final String name; public Request(String name) { this.name = name; } public String getName() { ...

chenxingzi的博客 125

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java 多线程 分布式_Java多线程设计模式

1 线程中的几个方法解释Thread.sleep(long毫秒)在指定的时间内让当前线程休眠,将控制权交给其他线程,休眠的线程依旧拥有它所占用的锁,Thread.yield();暂停或者放弃当前正在执行的线程,并且执行其他线程,但是并没有释放该线程所拥有的锁,线程放弃后,让其他相同或者更高线程得以运行。t.join()在A线程中等待t线程,可以指定一定时间后继续执行或者无限等待t.interrup...

weixin_35645460的博客 352

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java多线程设计模式详解[推荐]

java多线程设计模式详解[推荐]java多线程设计模式详解之一 线程的创建和启动java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。Thread类是实现了Runnable接口的一个实例,它代表一...

rcyl2003 525

java多线程设计模式

作者:xuefeng 来源: http://www.crackj2ee.com/Article/ShowArticle.asp?ArticleID=145线程的创建和启动java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成...

我的j2ee的专栏 313

Java多线程设计模式详解之一

[color=indigo][size=medium]线程的创建和启动 java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。 Thread类是实现了Runnable接口的一个实例,它代...

supercssupercs的博客 140

Thread学习

java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。 Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start(...

类似风华 169

thread

java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。 Thread类是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例...

CherryRemind的专栏 189

(五)Guarded Suspension模式

一、定义 guarded是"被保护着的"、"被防卫着的"意思,suspension则是"暂停"的意思。当现在并不适合马上执行某个操作时,就要求想要执行该操作的线程等待,这就是Guarded Suspension Pattern,会要求线程等候,以保障实例的安全性,其它类似的称呼还有guarded wait、spin lock等。 二、模式案例 下面的案例是一种简单的消息处理模式,客户栈...

daziyuanazhen的博客 288

java guardedby_Java多线程基础(五)——Guarded Suspension模式

一、定义guarded是“被保护着的”、“被防卫着的”意思,suspension则是“暂停”的意思。当现在并不适合马上执行某个操作时,就要求想要执行该操作的线程等待,这就是Guarded Suspension Pattern。Guarded Suspension Pattern 会要求线程等候,以保障实例的安全性,其它类似的称呼还有guarded wait、spin lock等。二、模式案例下面的...

weixin_42627541的博客 480
上一篇: Java多线程模式之Immutable
下一篇: Java多线程模式之Balking Pattern
NetFishTail
博客等级 码龄19年 3粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值