【仿真建模-anylogic】EventOriginator原理解析

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等。

相关推荐

  1. instanceof理解

    2024-06-16 17:06:02       53 阅读
  2. MongoDB理解

    2024-06-16 17:06:02       40 阅读
  3. ByteTrack算法理解

    2024-06-16 17:06:02       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 17:06:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 17:06:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 17:06:02       82 阅读
  4. Python语言-面向对象

    2024-06-16 17:06:02       91 阅读

热门阅读

  1. 访问api是如何使用的

    2024-06-16 17:06:02       27 阅读
  2. 搭建Python虚拟环境(五):Pyenv

    2024-06-16 17:06:02       32 阅读
  3. springboot读取配置时,读取到了系统环境变量

    2024-06-16 17:06:02       31 阅读
  4. CompletableFuture方法介绍及代码示例

    2024-06-16 17:06:02       34 阅读
  5. Mysql开启binlog

    2024-06-16 17:06:02       25 阅读
  6. mysql Innodb引擎常见问题

    2024-06-16 17:06:02       29 阅读
  7. 渗透测试nginx增加400,500报错页面

    2024-06-16 17:06:02       65 阅读
  8. 数学公式编辑器(前端预研)

    2024-06-16 17:06:02       35 阅读
  9. 超详细 Conda 指令详解---附有相应的示例

    2024-06-16 17:06:02       34 阅读
  10. HTML语言笔记

    2024-06-16 17:06:02       33 阅读
  11. 方 法

    2024-06-16 17:06:02       29 阅读