Author:赵志乾
Date:2024-06-16
Declaration:All Right Reserved!!!
1. 类图
2. 原理解析
2.1 核心函数
函数 | 功能 |
---|---|
double getRest(TimeUnits units) | 获取剩余时间 |
boolean isActive() | 判定事件的触发计划是否在执行引擎的事件调度队列中 |
boolean isCurrent() | 判定最近一次执行的调度事件是否为当前事件 |
Agent getAgent() | 获取Event Originator的owner |
2.2 代码解析
由于Anylogic内核做了代码混淆,以下代码为二次加工后的逻辑;
//***********************事件触发计划**********************
//用于向执行引擎传递待调度的事件
public class EventTriggerPlan{
// 事件发起者
EventOriginator eventOriginator;
// 事件触发时间
double triggerTime;
public EventTriggerPlan(EventOriginator eventOriginator, double triggerTime){
this.eventOriginator = eventOriginator;
this.triggerTime = triggerTime;
}
}
//************************核心字段*************************
// 事件owner
private transient Agent owner;
// 触发计划
private EventTriggerPlan triggerPlan;
//************************构造函数************************
protected EventOriginator(Agent owner) {
this.owner = owner;
this.triggerPlan = null;
}
//************************简单函数************************
// 获取owner
public Agent getAgent() {
return this.owner;
}
// 判定事件是否处于执行引擎的事件调度队列
public boolean isActive() {
// triggerPlan是由执行引擎生成,在事件被调度或取消后,该字段赋值为null,故依据该字段是否为null来快速判定事件是否位于事件调度队列
return this.triggerPlan != null;
}
//************************注册和撤销触发计划****************
// 注册触发计划
protected void registerTriggerPlan(double timeout) {
// 已有触发计划时不允许重复注册
if (this.triggerPlan != null) {
this.owner.getEngine().error("已有触发计划");
}
// 当超时时间为Double.POSITIVE_INFINITY时不再做计划
if (timeout== Double.POSITIVE_INFINITY) {
return;
}
// 计算触发时刻
double triggerTime = this.owner.getEngine().time() + timeout;
// 合法性校验:触发时刻不得早于当前时间
if (triggerTime < this.owner.getEngine().time()) {
this.owner.getEngine().error("触发时刻不得早于当前时间");
}
// 向执行引擎注册触发计划
this.triggerPlan = this.owner.getEngine().registerTriggerPlan(this, triggerTime);
}
// 撤销触发计划--幂等
protected final void unregisterTriggerPlan() {
// 存在触发计划时,从执行引擎撤回
if (this.triggerPlan != null) {
this.owner.getEngine().unregisterTriggerPlan(this.triggerPlan);
this.triggerPlan = null;
}
}
//*************************获取剩余时间********************************
public double getRest(TimeUnits unit) {
double rest = this.triggerPlan !=null ? this.triggerPlan.triggerTime-this.owner.getEngine().time() : Double.POSITIVE_INFINITY;
return this.owner.toTimeUnits(this.getRest(), unit);
}
//************************事件触发后执行的逻辑**************************
void execute() {
// 默认逻辑是将触发计划标记清空;自定义逻辑由子类实现
this.triggerPlan = null;
}
3. 应用场景
该类为anylogic中所有离散事件类型的基类,如Event、DynamicEvent、Transition等。