多线程设计模式-保护性暂挂模式

定义:如果某个线程执行特定的操作前需要满足一定的条件,则在该条件未满足时将该线程暂停运行(即暂挂线程,使其处于等待状态,直到该条件满足时才继续该线程的运行)

 

保护性暂挂模式UML图

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值