我正在为我的离散事件模拟开发一个时钟类。我已经在PriorityQueue中保存了事件,因此根据哪个事件具有最近的事件时间进行排序。然而,有一件事我无法理解。在我读过的关于离散事件模拟的论文中,明确指出时钟从事件跳转到事件,因此没有必要有一个“滴答”的时钟。
但是如何工作,我有一个EventScheduler类,它保存PriorityQueue中的事件。所以在确定下一个事件的时间之后,我可以在Clock中调用一个“setTime”方法,EventScheduler会在下一个事件的给定时间内调用它吗?但那么它永远不会像一个时钟那样继续跳到下一个事件?
我认为时钟运行(滴答),然后它知道EventScheduler何时发生事件,当时钟到达那个时间时,它处理事件,更新系统状态并可能生成输出事件。
很抱歉有点不清楚,但我只是对时钟如何工作的任何提示感兴趣,它是否只是在事件发生时只做“做”事情,还是只是从事件跳到事件?
你建议我可以使用java中的任何内置功能吗?例如。定时器类
答案 0 :(得分:5)
这个想法是在没有进入你的事件队列的情况下发生 nothing 。想一想:在“滴答”的时候,你的时钟是做什么的,但是没有事件?没有。那么为什么要处理这些时间呢?
所以是的,你只是从队列中的事件转到事件。实际上,离散事件中的“时钟”几乎就是你所构建的:一个按“按时间顺序”顺序排序的优先级队列,以及一些“现在”的意思,即队列中的位置。
如果你弹出头队列,那么“now”就可以 队列的头部,你就完成了。通常,更复杂的模型可能具有其他功能,例如能够检测何时尝试在“现在”之前安排事件 - 例如,这表示模型响应太慢:在现实世界中,它永远都会“迟到”并赶上整个模拟过程中发生的事情。
如果您有例如一个需要每秒更新的模型,然后你必须将这些事件放入队列中,否则它们就不会发生。通常,对于适合离散事件仿真模型的问题(在我的职业生涯中,这是基于物理的建模),这不是问题:当没有事件时,您的模型通常“空闲”,并且可以计算其状态在任何特定时间,当没有事件改变他们的状态。
如果您的模型不适用,那么离散事件建模可能不适合您的问题域。
答案 1 :(得分:1)
java.util.concurrent包(自Java 5起可用)有助于构建可以从多核系统和DES应用程序中受益的并发应用程序。 这是为这些应用程序设计的项目列表。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html