这些都是根据我最近看的《Java实战指南多线程编程(设计模式篇)》所得整理。
模式名称
Guarded Suspension(保护性暂挂模式)
模式面对的问题
多线程编程中,往往将一个任务分解为不同的部分,将其交由不同的线程来执行,这些线程相互协作的时候,会出现一个线程等待另一个线程一定操作过后才能进行的情景,这个时候就需要这个线程退出执行。
解决方法
有一个类GuardedObject包含受保护方法的对象,存放被保护对象的方法和被保护对象的唤醒方法。一个类GuardedAction抽象目标动作,并关联了目标动作锁需的保护条件.一个ConcreteGuardedAction应用程序锁体现的具体目标动作及其关联的保护条件,一个Predicate抽象保护条件,ConCretePredicate应用程序锁实现的具体保护条件,Blocker负责执行受保护的方法所在线程的挂起和唤醒。并执行ConcreteGuardedAction锁执行的目标操作。ConditionVarBlocker给予Java条件变量实现的Blocker.
例子代码
这也是书上的代码,需求是:某系统有个告警功能模块,改模块的主要功能是将其接收到的告警信息发送给告警服务器。
AlarmAgent类
public class ALarmAgent {
//用于记录AlarmAgent
private volatile boolean connectedToServer = false;
//模式角色:GuardedSuspension.Predicate
private final Predicate agentConnected = new Predicate(){
@Override
public boolean evaluate(){
return connectedToServer;
}
};
//模式角色GuaededSuspension.Blocker
private final Blocker blocker = new ConditionVarBlocker();
//心跳定时器
private final Timer heartbeatTimer = new Timer(true);
//发送告警信息
public void sendAlarm(final AlarmInfo alarm) throws Exception {
GuardedActio