【Java学习笔记】19:Guarded Suspension Pattern
来源:互联网 发布:淘宝补单方法 编辑:程序博客网 时间:2024/06/05 08:11
Guarded Suspension Pattern表示当前并不适合马上执行某个操作时,就要求想要执行该操作的线程等待,以保证实例的安全性。Java中用while语句来测试条件,不满足时用wait方法来等待。而当条件更改后,用notify/notifyAll方法唤醒,直至再次获取锁定执行。
*请求的实例类Request.java
package day19;//该类作为ClientThread传递给ServerThread的实例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+"]";}}
*请求队列RequestQueue.java
package day19;import java.util.LinkedList;//该类是用来依次存放请求的类public class RequestQueue {private final LinkedList<Request> queue=new LinkedList<Request>();//在RequestQueue里所存放的请求中将最早传入的一个取出public synchronized Request getRequest(){while(queue.size()<=0)//请求队列里没有东西时等{try{wait();//该线程不再活动,置于等待状态,切换到其他线程运行}catch(InterruptedException e){}}return (Request)queue.removeFirst();//返回队头}//增加一个请求到RequestQueue的队尾public synchronized void putRequest(Request request){queue.addLast(request);//加入队尾,这时getRequest条件有机会满足了notifyAll();//那么就唤醒所有在等待的线程}}
在RequestQueue类中的getRequest方法用了一个while语句,必须要满足queue.size()>0才执行后面的具体实现。像这样一定要满足的条件,称为Guarded Suspension Pattern的警戒条件。当线程抵达while语句的时候,会分为满足和不满足警戒条件两种情况,当警戒条件成立时,线程不会进入while块,而是执行后面的语句。当警戒条件不成立时,说明当前并不适合马上执行这个操作,就进入while块。在这里是线程执行this的wait方法,然后进入this的等待区,并解除this的锁定。正在wait的线程,期望警戒条件成立时,收到notify/notifyAll,然后退出等待区,不过还要等到再次获取锁定才能执行。
package day19;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);//调用基类构造传入namethis.requestQueue=requestQueue;this.random=new Random(seed);}public void run(){for(int i=0;i<100;i++){Request request=new Request("No."+i);//生成一个请求System.out.println(Thread.currentThread().getName()+" requets "+request);requestQueue.putRequest(request);//增加这个请求到队尾try//延时{Thread.sleep(random.nextInt(1000));}catch(InterruptedException e){}}}}
*接受请求的线程类ServerThread.java
package day19;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);//调用基类构造传入namethis.requestQueue=requestQueue;this.random=new Random(seed);}public void run(){for(int i=0;i<100;i++){Request request=requestQueue.getRequest();//从请求队列中获取一个请求System.out.println(Thread.currentThread().getName()+" handles "+request);try//延时{Thread.sleep(random.nextInt(1000));}catch(InterruptedException e){}}}}
*测试类Main.java
package day19;public class Main {public static void main(String[] args) {RequestQueue requestQueue=new RequestQueue();//建立一个请求队列实例new ClientThread(requestQueue,"Alice",1234567L).start();//Alice送出请求new ServerThread(requestQueue,"Bobby",7654321L).start();//Bobby处理请求}}
部分运行结果:
Alice requets [RequestNo.5]
Bobby handles [RequestNo.5]
Alice requets [RequestNo.6]
Alice requets [RequestNo.7]
Bobby handles [RequestNo.6]
Alice requets [RequestNo.8]
Alice requets [RequestNo.9]
Bobby handles [RequestNo.7]
Bobby handles [RequestNo.8]
Bobby handles [RequestNo.9]
在Guarded Suspension Pattern中,除了有被while-wait防卫的方法外,还应有更改实例状态(特别是用来改警戒条件)的方法。
*等待端的范例
while(!ready){wait();}//后面做该做的事
*唤醒端的范例
ready=true;//改变实例状态而使警戒条件成立时notifyAll();
- 【Java学习笔记】19:Guarded Suspension Pattern
- Guarded Suspension Pattern
- Guarded Suspension Pattern
- Java线程之Guarded Suspension Pattern和Balking Pattern
- 《java多线程设计模式 第三章Guarded Suspension Pattern》
- 线程之旅--Guarded Suspension Pattern
- java多线程设计模式之Guarded Suspension
- Java 多线程设计模式之Guarded Suspension
- Guarded Suspension 模式
- Guarded Suspension设计模式
- 第三章 Guarded Suspension
- 并行-Guarded Suspension模式
- Guarded Suspension Patten ----java多线程模式(三)
- Java中的线程(六)- Guarded Suspension 模式
- Java 并行程序设计模式 (Guarded Suspension模式)
- 由迅雷笔试题想到的——Guarded Suspension Pattern设计模式
- 由迅雷笔试题想到的——Guarded Suspension Pattern设计模式
- Java程序性能优化 读书笔记(十二)并行设计模式:Guarded Suspension模式
- java高手之路上的必备基础知识
- Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'BaseResultMap'
- 设置SOAPFaultException中SOAPFault的内容
- Ubuntu 添加应用程序快捷方式
- JVM调优总结 -Xms -Xmx -Xmn -Xss(转)
- 【Java学习笔记】19:Guarded Suspension Pattern
- 32位int 最小负整数
- 110-获取接口信息(二)
- RMI技术验证哥德巴赫猜想
- Fastjson可以解析类的嵌套吗?
- Go语言中的type含义(转载)
- 夜神模拟器使用的小问题
- Python 简单的定制一个计时器
- 绑定在标签中的事件如何获取当前元素