diagram1.png
Entity 是仿真中所有组件的基础

Q & A

Q : 系统中初始化事件是如何执行的?
A :

  1. Simulation 的 startRun() 方法会向 EventManager 中的事件队列中插入一个事件节点(该节点的执行目标是 InitModelTarget()

    1. /**
    2. * Starts a single simulation run.
    3. * @param evt - EventManager for the run.
    4. */
    5. public static void startRun(EventManager evt) {
    6. // 将[初始化任务]设置到调度器中
    7. evt.scheduleProcessExternal(0, 0, false, new InitModelTarget(), null);
    8. // 在指定时间恢复运行
    9. evt.resume(evt.secondsToNearestTick(Simulation.getPauseTime()));
    10. }
  2. 从线程池拉取线程,开始调度EventManager,执行事件队列的队首事件 ```java // EventManager public void resume(long targetTicks) { synchronized (lockObject) {

    1. targetTick = targetTicks;
    2. rebaseRealTime = true;
    3. if (executeEvents)
    4. return;
    5. executeEvents = true;
    6. // 从线程池中拉取一个线程,指定事件管理器,唤醒该线程
    7. Process.processEvents(this);

    } }

// process /**

  • 从线程池拉取一个线程, 尝试执行给定eventManager中的事件
  • Pull a process from the pool and have it attempt to execute events from the given eventManager
  • @param evt */ static void processEvents(EventManager evt) { Process newProcess = Process.getProcess(); newProcess.setup(evt, null, null); newProcess.wake(); } ```
  1. 线程被唤醒,调用 EventManager.execute -> executeTarget , executeTarget 调用 ProcessTarget.process() 方法

    1. private boolean executeTarget(Process cur, ProcessTarget t) {
    2. try {
    3. // If the event has a captured process, pass control to it
    4. Process p = t.getProcess();
    5. if (p != null) {
    6. p.setNextProcess(cur);
    7. p.wake();
    8. threadWait(cur);
    9. // 通知 execute() 继续获取事件执行
    10. return true;
    11. }
    12. // 执行进程目标的任务
    13. t.process();

    Q : 为什么仿真启动时,唤醒2次线程后才会执行初始化任务?
    A : 可能是使用 resume program 的副作用,建议对 processEvents() 使用 step over

    1. /**
    2. * 从线程池拉取一个线程, 尝试执行给定eventManager中的事件
    3. * Pull a process from the pool and have it attempt to execute events from the given eventManager
    4. * @param evt
    5. */
    6. static void processEvents(EventManager evt) {
    7. Process newProcess = Process.getProcess();
    8. newProcess.setup(evt, null, null);
    9. newProcess.wake();
    10. }

Q : 事件和实体是如何产生关联的?🏳‍🌈
A :