【问题标题】:Are there any classes in Java suitable to be used as a 'simulation clock' in discrete-event simulation?Java中是否有适合用作离散事件模拟中的“模拟时钟”的类?
【发布时间】:2011-06-25 14:52:15
【问题描述】:

本质上,我正在寻找可以模拟时钟的东西,并且可以通过调用方法将其向前增加一个时间单位。在标准 Java 库中可以找到诸如此类的东西吗?还是您必须自己实现?

【问题讨论】:

    标签: java events simulation clock


    【解决方案1】:

    根据您的用例,查看以下内容:

    简单

    int counter;  //counter++
    long counter; //counter++ (If you expect the time to overflow int)
    

    可变 (org.apache.commons.lang.mutable.*):

    MutableInt counter;  //counter.increment();
    MutableLong counter; //counter.increment();
    

    线程安全:

    AtomicInteger counter; //counter.incrementAndGet();
    AtomicLong counter;    //counter.incrementAndGet();
    

    【讨论】:

      【解决方案2】:

      看看 SimKit。它是一个基于 Java 的开源离散事件引擎。它有据可查,您可以提取时钟和事件列表并根据自己的目的进行自定义。它得到了很好的支持,因为它被用来向研究生教授 DES 的入门课程。

      http://diana.nps.edu/Simkit/

      【讨论】:

        【解决方案3】:

        一个简单的整数呢? - 可以加一:counter++

        或者java.util.concurent.atomic.AtomicInteger,如果你有多个线程。它甚至提供了incrementAndGet() 函数。

        【讨论】:

        • 对不起,这是错误的。 Barjavel 询问离散事件模拟,您的回复描述了时间步长模拟。在 DES 中,时间直接前进到下一个事件的发生,它不会以固定增量前进,因此计数器将不起作用。您需要一个事件通知的 PriorityQueue,每个通知都会告诉您事件的时间以及它将是什么事件。 PriorityQueue 按事件时间排序,模拟通过提取下一个事件通知、将模拟时钟更新为其时间并执行事件逻辑来进行。 SimKit(如下所述)执行此操作。
        【解决方案4】:

        标准日历 / GregorianCalendar 应该可以为您解决问题。

        【讨论】:

        • 如果您要寻找的只是可以添加一个时间单位(例如一秒)的东西,那么您可以在 Calendar 上使用 add() 方法,然后通过 Calendar.SECOND 作为此方法的第一个参数。
        【解决方案5】:

        我不了解标准 Java API,但在自行开发之前请查看 Quartz

        【讨论】:

          猜你喜欢
          • 2012-10-22
          • 2017-05-31
          • 2011-04-29
          • 2015-02-14
          • 1970-01-01
          • 2014-04-12
          • 1970-01-01
          • 2018-09-19
          • 2019-09-07
          相关资源
          最近更新 更多