`

Guarded Suspension Pattern

阅读更多

       Guraded Suspend Partten是当前不适合执行时,就进行等待,直到被唤醒去执行。

 

        类Request用来表示请求,这里没有特殊的处理。

        RequestQueue是一个队列,用来存储所有由ClientThread发出来的请求,它有两个synchronized方法getRequest和putRequest,putRequest是向队列中存储一个请求,而getRequest是从队列中取出一个请求,如果队列为空,那么就进行等待。

 

public class Request {
	private 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<Request> queue=new LinkedList<Request>();
	public synchronized Request getRequest(){
		while(queue.size()<=0)
			try{
				wait(); //不能sleep(100),因为它会一直占线程,synchronized,其他线程没有机会
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		return (Request)queue.removeFirst();
	}
	
	public synchronized void putRequest(Request request){
		queue.addLast(request);
		notifyAll();
	}
}

 

 

        类ClientThread用来表示请求的线程,它不断的请求Request”No.0“、"No.1"、"No.2"。。。,并且将请求的Request放到队列中。

        类ServerThread是处理请求,它从队列中不断的读取线程。

 

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);
	}
	@Override
	public void run(){
		for(int i=0;i<10000;i++){
			Request request=new Request("N0."+i);
			System.out.println(Thread.currentThread().getName()+" requests "+request);
			requestQueue.putRequest(request);
			try{
				Thread.sleep(random.nextInt(1000));
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}

}

 

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);
	}
	@Override
	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){
				e.printStackTrace();
			}
		}
	}

}

 运行结果:

Ally requests [Request N0.0]
Bob handles [Request N0.0]
Ally requests [Request N0.1]
Ally requests [Request N0.2]
Bob handles [Request N0.1]
Bob handles [Request N0.2]
Ally requests [Request N0.3]
Bob handles [Request N0.3]
Ally requests [Request N0.4]
Bob handles [Request N0.4]
Ally requests [Request N0.5]

 

        这里有一个等待,也就是while("警戒条件"的否定){ 使用wait等待 },他会一直到条件满足后,这个进程才会继续。

        队列中用了两个synchronized方法,它是用来保护RequestQueue的字段,例如判断size是否大于0、从queue中取出一个元素。

        这种模式有三个特征:有循环体的存在、有条件的测试、因为某种原因在等待。

 

 

分享到:
评论

相关推荐

    Java多线程详解

    3、Guarded Suspension ———— 要等到我们准本好哦 4、Balking ———— 不需要的话,就算了吧 5、Producer-Consumer ———— 我来做,你来用 6、Read-Write Lock ———— 大家想看就看吧,不过看的时候不能写哦...

    java多线程设计模式 (PDF中文版, 附源码)

    第3章 Guarded Suspension——要等到我准备好喔 第4章 Balking——不需要的话,就算了吧 第5章 Producer-Consumer——我来做,你来用 第6章 Read-Write Lock——大家想看就看吧,不过看的时候不能写喔 第7章 read-...

    aqs-并发编程笔记.pdf

    并发编程笔记中的知识点涵盖了保护性暂停模式(Guarded Suspension Design Pattern)的定义、实现与分析,以及在Java中如何通过GuardedObject对象来实现多线程间的结果传递和超时处理。以下是详细的知识点梳理: 1....

    laravel中的fillable和guarded属性详解

    在创建和更新模型时,`fillable` 和 `guarded` 属性是两个非常重要的概念,它们控制着如何通过 `create` 和 `update` 方法批量赋值模型属性。 首先,我们来看 `fillable` 属性。`fillable` 被称为白名单,它定义了...

    aqs-并发编程(2)笔记.pdf

    在并发编程中,保护性暂停模式(Guarded Suspension Design Pattern)是一种常用的同步机制,用于线程间的协作。该模式允许一个线程等待另一个线程的特定操作完成,然后继续执行。在该模式中,线程间共享的某个对象...

    20.9.24aqs-并发编程笔记.pdf

    保护性暂停模式(Guarded Suspension Design Pattern)是一种在多线程环境下实现线程之间安全地传递信息的模式。这种模式主要解决了在并发编程中如何安全高效地进行线程间通信和数据传递的问题。 该模式的基本概念...

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    如监控任务的生命周期管理、单线程执行模式、读写锁分离、不可变对象设计,以及`Future`和`Guarded Suspension`模式,这些模式在解决实际并发问题时有着广泛的应用。 书中的每一章都包含丰富的实例和详尽的解释,...

    guarded-array:边界检查数组

    var guard = require ( 'guarded-array' ) //First create any old array var array = [ 0 , 1 , 2 , 3 , 4 , 5 ] //Then we protect it using guard! var guardedArray = guard ( array ) //The guarded array ...

    逻辑编程语言:GHC (Guarded Horn Clauses).zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 ...

    java线程安全总结.pdf

    8. **Guarded Suspension 模式**:这是一种设计模式,通常使用`wait()`和`notify()`方法来协调线程间的执行顺序,确保特定条件满足时线程才能继续执行。 9. **Double-Check Locking(双重检查锁定)**:这是一种...

    guarded-string:防止在应用程序中意外地在字符串中引入XSSKong

    yarn add guarded-string 用法 重要的! 应该将其用于防止XSS攻击之类的东西,而不是用于隐藏敏感信息。 import guardedString from 'guarded-string' ; const myString = guardedString `My very important (but ...

    java并发编程经典书籍(英文版)

    - **并发模式**:介绍了如Producer-Consumer、Builder、Guarded Suspension等经典并发模式,并提供了Java实现。 - **并发集合**:详述了JUC(Java Util Concurrency)库,包括ArrayList、LinkedList、HashMap等...

    scalac-guardedblocks-plugin:简单的Scala编译器插件

    `scalac-guardedblocks-plugin`就是这样一个插件,它专注于在Scala代码中引入一种新的语法结构,以增强代码的安全性和可读性。 **什么是`scalac-guardedblocks-plugin`** `scalac-guardedblocks-plugin`是一个针对...

    java多线程设计模式详解(PDF及源码)

    第1章 Single Threaded Execution——能通过这座桥的,只有一个人 第2章 Immutable——想破坏它也没办法 第3章 Guarded Suspension——要等到我准备好喔 第4章 Balking——不需要的话,就算了吧 第5章 Producer-...

    concurrent.rar

    8. **并发编程模式**:如生产者-消费者模式、读写锁模式、双检锁(DCL)模式、工兵(Guarded Suspension)模式等,这些模式在并发编程中有着广泛的应用。 9. **并发异常处理**:在并发编程中,死锁、活锁、饥饿等是...

    guarded-bayou-7383

    JAX-RS 模板应用程序这是使用 JAX-RS 的轻量级 RESTful API 的模板。 示例代码是获取当前时间的调用。在本地运行应用程序首先构建: $mvn clean install然后运行它: $ java -cp target/classes:target/dependency/*...

    高性能java系统实现与调优

    - **Guarded Suspension**:在没有足够的资源时暂停执行,避免资源浪费。 - **不变模式**:通过不可变对象减少锁的竞争。 - **生产者-消费者**:通过共享缓冲区协调多个线程的工作。 - **JDK并发框架与优化**: ...

    GuardedCommands:用于模拟防护命令语言的Python程序

    防护命令语言六月7,2018 CS522正式语言和自动机20183111金李涵概括 2018年Spring正式语言和自动机理论项目1〜2 防护命令语言(以下称为GCL)解析和执行功能的实现语句语法说明中止论文说“做任何事情”,但实际上并...

Global site tag (gtag.js) - Google Analytics