Suspention——要等到我准备好哦

 
定义: 当现在并不适合马上执行某个操作,要求想要执行该操作的线程等待。
Request:表示“请求”的类。 
    一个只有存放名字的类
    private final String name;的get和set方法
RequestQuery:依次存放请求以待使用的类。
    getRequest和putRequest方法

 

一、
getRequest时如果queue的size小于0就会等待,putRequest的notifyAll就是唤醒那个等待。
二、
这里这个size的判断很重要,因为操作LinkedList的removeFirst方法,如果LinkedList里面一个元素都没有的话,就会抛出NoSuchElementException异常。
因此size>0这种必须要满足的条件,称为Guarded Suspension Pattern的警戒条件,这里靠while保证警戒条件一定会成立。
三、
调用wait后的线程,除非被notify/notifyAll,不然都会在等待里持续等待的状态。
此处线程是不想等待的,线程在等待的是实例状态的变化。
当了解线程在等待什么,就知道何时该调用notify、notifyAll了。
CientThread:动态送出请求的类。
    包含ClientThread类的实例。会不断调用putRequest。

 

ServerThread:接受请求的类。

 

 Main类

程序运行结果

Synchronized的意义
getRequest和putRequest都是synchronized方法。
看到Synchronized就要想到它是在保护什么?????
这个Synchronized是在保护LinkedList实例的queue字段。
Wait与锁定
_____________________示例到此结束_____________________
Guarded Suspension Pattern的所有参与者(就只有一个):
  1. GuardedObject被防卫的对象

 

___________________扩展______________________________

————————————————练习————————————————————————

 

问题3.4

 

 

posted @ 2019-07-09 13:36  TangXinPing  阅读(474)  评论(0编辑  收藏  举报