
Entity 是仿真中所有组件的基础
Q & A
Q : 系统中初始化事件是如何执行的?
A :
Simulation 的
startRun()方法会向EventManager中的事件队列中插入一个事件节点(该节点的执行目标是InitModelTarget())/*** Starts a single simulation run.* @param evt - EventManager for the run.*/public static void startRun(EventManager evt) {// 将[初始化任务]设置到调度器中evt.scheduleProcessExternal(0, 0, false, new InitModelTarget(), null);// 在指定时间恢复运行evt.resume(evt.secondsToNearestTick(Simulation.getPauseTime()));}
从线程池拉取线程,开始调度EventManager,执行事件队列的队首事件 ```java // EventManager public void resume(long targetTicks) { synchronized (lockObject) {
targetTick = targetTicks;rebaseRealTime = true;if (executeEvents)return;executeEvents = true;// 从线程池中拉取一个线程,指定事件管理器,唤醒该线程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(); } ```
线程被唤醒,调用 EventManager.execute -> executeTarget , executeTarget 调用 ProcessTarget.process() 方法
private boolean executeTarget(Process cur, ProcessTarget t) {try {// If the event has a captured process, pass control to itProcess p = t.getProcess();if (p != null) {p.setNextProcess(cur);p.wake();threadWait(cur);// 通知 execute() 继续获取事件执行return true;}// 执行进程目标的任务t.process();
Q : 为什么仿真启动时,唤醒2次线程后才会执行初始化任务?
A : 可能是使用 resume program 的副作用,建议对processEvents()使用 step over/*** 从线程池拉取一个线程, 尝试执行给定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();}
Q : 事件和实体是如何产生关联的?🏳🌈
A :
