Author:赵志乾
Date:2024-06-12
Declaration:All Right Reserved!!!
1. 类图
2. 原理解析
EventOriginator是Anylogic中各类事件的父类,对外暴露的接口主要有:
函数 | 功能 |
boolean isActive() | 判定是否存在尚未调度的执行规划 |
double getRest(TimeUnits units) | 获取当前时刻至事件逻辑触发时的时间间隔,当不存在尚未执行的规划时,该函数将返回infinity |
DynamicEvent是EventOriginator的子类,其主要扩充了 void reset()函数;
CustomDynamicEvent是由用户拖拽Dynamic Event组件后由Anylogic自动生成的DynamicEvent子类,用户可在该组件的属性窗口自定义入参和事件逻辑;Anylogic会依据自定义入参自行调整生成的构造函数,并为用户生成对应的create_CustomDynamicEvent方法;
注意:CustomDynamicEvent是动态事件组件中的Name属性,用户可自行修改;
create_CustomDynamicEvent函数的内部逻辑:新建CustomDynamicEvent实例并返回;这也是DynamicEvent可以并行的原因(每次都是生成一个新的实例,互不影响);
3. 应用
场景1:创建独立的动态事件
// 每次调用create_CustomDynamicEvent函数都会重新生成一个CustomDynamicEvent实例,相互之间本就独立;
create_CustomDynamicEvent(10,MINUTE);
create_CustomDynamicEvent(20,MINUTE);
create_CustomDynamicEvent(30,MINUTE);
场景2:需要动态取消动态事件
// create_CustomDynamicEvent函数返回值为CustomDynamicEvent,使用List存储起来;在需要需要事件时调用CustomDynamicEvent实例的reset函数即可;
List<CustomDynamicEvent> dynamicEvents = new ArrayList<>();
dynamicEvents.add(create_CustomDynamicEvent(10,MINUTE));
CustomDynamicEvent dynamicEvent = dynamicEvents.get(0);
// 是否使用isActive做预先判定无关紧要,因为DynamicEvent的reset函数是幂等的;
if(dynamicEvent.isActive()){
dynamicEvent.reset();
}