定义:如果某个线程执行特定的操作前需要满足一定的条件,则在该条件未满足时将该线程暂停运行(即暂挂线程,使其处于等待状态,直到该条件满足时才继续该线程的运行)
GuardedObject: 包含受保护方法的对象
guardedMethod: 受保护方法
stateChanged: 改变GuardedObject实例状态的方法。该方法负责在保护条件成立时唤醒受保护方法的执行线程
GuardedAction: 抽象了目标动作,并关联了目标动作所需的保护条件
call: 用于表示目标动作的方法
ConcreateGuardedAction: 应用程序所实现的具体目标动作及其关联的保护条件
Predicate: 抽象了保护条件
evaluate: 用于表示保护条件的方法
ConcretePredicate: 应用程序所实现的具体保护条件
Blocker;负责对执行guardedMethod方法的线程进行挂起和唤醒,并执行ConcreteGuardedAction所实现的目标操作
callWithGuard: 负责执行目标操作和暂挂当前线程
signalAfter: 负责执行其参数指定的动作和唤醒由该方法所属Blocker实例所暂挂的线程中的一个线程
signal: 负责唤醒由该方法所属Blocker实例所暂挂的线程中的一个线程
broadcast: 负责唤醒由该方法所属Blocker实例暂挂的所有线程
ConditionVarBlocker: 基于Java条件变量(java.util.concurrent.locks.Condition)实现的Blocker
下列代码中AlarmAgent#sendAlarm()负责将信息发送到服务器,但是由于网络连接可能会出现问题(中断或者未连接等情况),执行这个方法的线程就会暂挂直到被唤醒(即连接成功建立)。实现的方法是设立连接标志connectedToServer,当标志被设为true,即AlarmAgent#onConnected()$signalAfter()就会调用condition.signal()方法唤醒暂挂线程。这里利用Condition的特性来实现暂挂(等待)和唤醒。
package com.bruce.guardedSuspension;
/**
* @Author: Bruce
* @Date: 2019/5/30 21:21
* @Version 1.0
*/
public interface Predicate {
boolean evaluate();
}
package com.bruce.guardedSuspension;
import java.util.concurrent.Callable;
/**
* @Author: Bruce
* @Date: 2019/5/30 21:21
* @Version 1.0
*/
public interface Blocker {
<V> V callWithGuarded(GuardedAction<V> guardedAction) throws Exception;
void signalAfter(Callable<Boolean> stateOperation) throws Exception;
void signal() throws InterruptedException;
void broadcastAfter(Callable<Boolean> stateOperation) throws Exception;
}
package com.bruce.guardedSuspension;
/**
* @Author: Bruce
* @Date: 2019