1.保护性暂停的定义
2.实现代码
get方法用来获取结果response,如果结果为空则一直等待,直到另一个线程调用complete方法产生结果,并且调用notifyall方法唤醒waitset中的线程,此时response不为空,线程继续工作。
可以在get方法里设置超时等待,即:超过时间不再等待。
3.join的原理
millis即线程需要等待的时间,millis=0时,只要线程存活,就一直等待下去,直到线程结束;millis>0时,设置超时等待,当等待时间不超过millis时,继续等待,超过millis后跳出循环,不再等待。
4.扩展—解耦等待和生产
1.解耦类(邮箱)
图中的Future(即解耦类)是需要维护一个GuardedObject的集合,并且需要将每个GuardedObject的对象区分开,所以需要给GuardedObject对象带ID;
为了保证ID的唯一性使用synchronized,同一时间只有一个线程能为GuardedObject对象生成id,
收信者调用getGuardedObject以后,需要将信件从邮箱中删除,remove方法能够在返回信息后删除信息。
2.接受结果的线程(收信者)
3.生成结果的线程(送信者)