Java 离散事件仿真中的时钟

Java 离散事件仿真中的时钟,java,timer,scheduling,simulation,clock,Java,Timer,Scheduling,Simulation,Clock,我正在为离散事件模拟开发一个时钟类。我已经将事件保存在PriorityQueue中,并根据哪个事件具有最近的事件时间进行排序。然而有一件事我无法理解。在我读过的关于离散事件模拟的论文中,明确指出时钟从一个事件跳到另一个事件,因此没有必要有一个“滴答”的时钟 但是这是如何工作的,我有一个EventScheduler类,它保存PriorityQueue中的事件。因此,在确定下一个事件的发生时间之后,我是否可以在EventScheduler使用下一个事件的给定时间调用的时钟中调用“setTime”方法

我正在为离散事件模拟开发一个时钟类。我已经将事件保存在PriorityQueue中,并根据哪个事件具有最近的事件时间进行排序。然而有一件事我无法理解。在我读过的关于离散事件模拟的论文中,明确指出时钟从一个事件跳到另一个事件,因此没有必要有一个“滴答”的时钟

但是这是如何工作的,我有一个EventScheduler类,它保存PriorityQueue中的事件。因此,在确定下一个事件的发生时间之后,我是否可以在EventScheduler使用下一个事件的给定时间调用的时钟中调用“setTime”方法?但是,它永远不会像时钟一样运行,它会一直跳到下一个项目吗

我认为时钟运行(滴答声),然后它知道EventScheduler何时会发生事件,当时钟到达该时间时,它处理事件,更新系统状态,并可能生成输出事件

抱歉有点不清楚,但我只是对时钟如何工作的一些技巧感兴趣,它是在一个事件发生时滴答作响,然后只“做”事情,还是只是从一个事件跳到另一个事件

您是否建议我使用java中的内置功能?例如,Timer类

其思想是,不进入事件队列,任何事情都不会发生。想想看:当时钟“滴答”一声,但没有任何事件时,你在做什么?没有什么。那么,为什么要处理这些时间呢

因此,是的,您只需在队列中从一个事件转到另一个事件。实际上,离散事件中的“时钟”与您所构建的几乎完全相同:优先级队列按“时间顺序”排序,某种意义上的“现在”是队列中的位置

如果你从队列的最前面跳出来,那么“现在”可能只是队列的最前面,你就完成了。通常情况下,更复杂的模型可能具有更进一步的功能,例如能够检测何时尝试在“现在”之前安排事件-例如,这表示模型响应太慢:在现实世界中,它总是“晚”的,并且能够赶上整个模拟中发生的事情

例如,如果您有一个模型需要每秒更新一次,那么您必须将这些事件放入队列中,否则它们不会发生。通常,对于非常适合离散事件模拟模型的问题(在我的职业生涯中,这是基于物理的建模),这不是问题:当没有事件时,您的模型通常是“空闲”的,并且可以在未来的任何特定时间,当没有事件改变其状态时,计算其状态


如果您的模型不是这样,那么离散事件建模可能并不真正适合您的问题域。

java.util.concurrent包(自java 5开始提供)有助于构建可从多核系统和DES应用程序中受益的并发应用程序。 以下是为此类应用程序设计的项目列表。

非常感谢你,马特。这确实澄清了很多事情。