Guarded Suspension 设计模式可以保证,当线程在访问某个对象时,发现条件不满足,就挂起等待条件满足时再次访问
public class GuardedSuspensionQueue {

    // 定义存放Integer类型的queue
private final LinkedList<String> queue = new LinkedList<String>(); // 定义queue的最大容量为5
private final int LIMIT = ; public static final Random random = new Random(System.currentTimeMillis()); // 往queue中插入数据,如果queue中的元素超过了最大容量,则会陷入阻塞
public void offer(String data) {
synchronized (this) {
// 判断queue的当前元素是否超过了LIMIT
while (queue.size() >= LIMIT) {
// 挂起当前线程,使其陷入阻塞
System.out.println("向queue中添加元素,元素个数超过了限制,"+Thread.currentThread().getName()+"被挂起!");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 插入元素并且唤醒take线程
queue.addLast(data);
this.notifyAll();
}
} // 从队列中获取元素,如果队列此时为空,则会使当前线程阻塞
public String take() {
synchronized (this) {
// 判断如果队列为空
while (queue.isEmpty()) {
// 则挂起当前线程
System.out.println(Thread.currentThread().getName()+"从queue中取出元素,元素个数为0,被挂起!");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
//removeFirst不会返回null值,queue没有元素会抛出异常
String res = queue.removeFirst();
// 通知offer线程可以继续插入数据了
this.notifyAll();
return res;
}
} public static void main(String[] args) throws InterruptedException { GuardedSuspensionQueue queue = new GuardedSuspensionQueue(); TakerThread takerThread = new TakerThread(queue,"【线程A】");
takerThread.start(); Thread.sleep(); // 创建3个生产线程向queue中添加数据
IntStream.rangeClosed(, ).forEach(i -> {
new Thread(() -> {
for (int j = ; j <= ; j++) {
queue.offer("【线程"+i+"】放入的"+j);
}
try {
Thread.sleep(random.nextInt());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}); Thread.sleep(10_000); takerThread.close();
} } class TakerThread extends Thread{
private volatile boolean close = false;
private GuardedSuspensionQueue queue ;
TakerThread(GuardedSuspensionQueue queue,String name){
this.queue = queue;
setName(name);
}
@Override
public void run() {
while(!close) {
String item = queue.take();
if(item == null) {
break;
}
System.out.println(Thread.currentThread().getName() + "从queue中取出数据:" + item);
try {
Thread.sleep(GuardedSuspensionQueue.random.nextInt());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
}
} public void close() {
this.close = close;
this.interrupt();
} }
 

Guarded Suspension设计模式的更多相关文章

  1. 并发设计模式之Guarded Suspension模式

    - 原文链接: http://www.joyhwong.com/2016/11/19/并发设计模式之guarded-suspension模式/ Guarded Suspension意为保护暂停,其核心 ...

  2. 多线程程序设计学习(4)guarded suspension模式

    Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者                1.1该 ...

  3. 多线程同步循环打印和Guarded suspension 模式

     * 迅雷笔试题: * 有三个线程ID分别是A.B.C,请有多线编程实现,在屏幕上循环打印10次ABCABC…  由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步. 线程同步有两种 ...

  4. 多线程学习之三生产者消费者模式Guarded Suspension

    Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者                1.1该 ...

  5. 多线程系列之四:Guarded Suspension 模式

    一,什么是Guarded Suspension模式如果执行现在的处理会造成问题,就让执行处理的线程等待.这种模式通过让线程等待来保证实例的安全性 二,实现一个简单的线程间通信的例子 一个线程(Clie ...

  6. 并行模式之Guarded Suspension模式

    并行模式之Guarded Suspension模式 一).Guarded Suspension: 保护暂存模式 应用场景:当多个客户进程去请求服务进程时,客户进程的请求速度比服务进程处里请求的速度快, ...

  7. Guarded Suspension Pattern【其他模式】

    Guarded Suspension Pattern public class GuardedSuspension { /** * Guarded Suspension Pattern[保护悬挂模式] ...

  8. Guarded Suspension模式简单实现

    Guarded Suspension 意为保护暂停,假设服务器很短时间内承受大量的客户端请求,客户端请求的数量超过服务器本身的即时处理能力,而服务器又不能丢弃任何一个客户端请求,此时可以让客户端的请求 ...

  9. 多线程编程-设计模式之保护性暂挂(Guarded Suspesion)模式

    Guarded Suspension模式的架构 核心是一个受保护方法(Guarded Method).该方法需要执行其所要真正执行的操作时需要满足特定的条件(Predicate,以下称之为保护条件). ...

随机推荐

  1. centos7安装jdk1.7(rpm版)

    一.环境 centos7 jdk-7u80-linux-x64.rpm下载:链接:https://pan.baidu.com/s/10UMrxNE1d2ZbDt7kvBM1yQ   提取码:pmov  ...

  2. jQuery 杂项方法大全

    下表列出了所有jQuery 杂项方法: 方法 描述 data() 将数据附加到选定元素或从中获取数据 get() 获取选择器匹配的DOM元素 index() 从匹配的元素中搜索给定的元素 $.noCo ...

  3. 前端开发CSS3——使用方式和选择器

    CSS是Cascading Style Sheets(层叠样式表)的简写,用于修饰文档的语言,可以修饰HTML.XML.SVN.每个语言都有每个语法的规则:CSS声明.CSS声明块.CSS选择器.CS ...

  4. SPC软控件提供商NWA的产品在各行业的应用(化工行业)

    Northwest Analytical (NWA)是全球领先的“工业4.0”制造分析SPC软件控件提供商.产品(包含: NWA Quality Analyst , NWA Focus EMI 和 N ...

  5. VMware基本用法

    ###VMware tools 介绍 只有在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之前自由移动(不用 ...

  6. Try-Catch-Finally语句块执行问题

    Try-Catch-Finally语句块执行问题 记录一个今天某公司的面试问题,其实我问题回答对了,但是面试官问我动手验证过没有,这还真没有,纯理论,被怼惨了,希望自己能变得更强大. Try-Catc ...

  7. 用构造函数创建对象时,new的行为

    用构造函数创建对象: var obj=new 类型名(属性值,…) new: 4件事: 1. 创建一个空对象 2. 让新的子对象继承构造函数的原型对象设置(自动设置新对象的__proto__属性指向构 ...

  8. centos7 下面显卡驱动安装

    一.安装驱动 屏蔽默认的nouveau cd /lib/modprobe.d/ sudo vim dist-blacklist.conf 将nvidiafb注释掉 #blacklist nvidiaf ...

  9. CF704D Captain America(上下界网络流)

    传送门 题意: 二维平面给出\(n\)个点,现在可以给每个点进行染色,染红色的代价为\(r\),染蓝色的代价为\(b\). 之后会有\(m\)个限制,形式如:\(t_i\ l_i\ d_i\),当\( ...

  10. python3 AES 加解密

    #coding:utf-8 import base64 from Crypto.Cipher import AES #注:python3 安装 Crypto 是 pip3 install -i htt ...