Java中的离散事件模拟时间单元

Java中的离散事件模拟时间单元,java,clock,seed,Java,Clock,Seed,我正在用Java进行离散事件模拟,下面是与时间相关的代码 class Event implements Runnable, Comparable { double time; Runnable runnable; Event(double time, Runnable aRunnable) { this.time = time; runnable = aRunnable; } public boolean lessTha

我正在用Java进行离散事件模拟,下面是与时间相关的代码

class Event implements Runnable, Comparable {
    double time;
    Runnable runnable;

    Event(double time, Runnable aRunnable) {
        this.time = time;
        runnable = aRunnable;
    }

    public boolean lessThan(Comparable y) {
        Event e = (Event) y; // Will throw an exception if y is not an Event
        return this.time <= e.time;
    }

    @Override
    public void run() {
        runnable.run();

    }
}

class Simulator extends AbstractSimulator {

    static Random rnd;
    static double time;
    double endTime;


    static double now() {
        return time;
    }

    Simulator(long seed, double simDuration) {
        time = 0.0;
        events = new ListQueue();
        rnd = new Random(seed);
        endTime = simDuration;
    }

    void doAllEvents() {
        Event e;
        while ((e = (Event) events.removeFirst()) != null && time < endTime) {
            if(time > e.time)
                System.out.printf("Something is worng! time=%f eventtime=%f",time,e.time);
            time = e.time;
            e.run();
            System.out.printf("\n Time = %f", time);

        }
    }
类事件实现可运行、可比较的{
双倍时间;
可运行的可运行的;
事件(双倍时间,可运行aRunnable){
这个时间=时间;
可运行=可运行;
}
公共布尔lessThan(可比y){
Event e=(Event)y;//如果y不是事件,则将引发异常
返回此时间(例如时间)
System.out.printf(“某物正在工作!时间=%f事件时间=%f”,时间,即时间);
时间=时间;
e、 run();
System.out.printf(“\n时间=%f”,时间);
}
}

我考虑基于事件失败时间的结果,但是当我绘制它时,我需要使用一个单元。

Java在模拟时使用哪种单位?或者我能把它们当作第二个吗?或者是否有任何计算将其转换为真实世界时间

提前感谢,

致以最良好的祝愿

更新:

谢谢你的回答,我试着测量准确的时间,但我这里有个问题。现有的虚拟仿真时间是衡量网络寿命的。例如,它的工作原理与精确时间不同;当我对75台设备进行模拟时,NetworkLifetime更短,比如说70.0,但实时性超过35台设备,寿命为1500.0。这是因为每个设备都在重复事件

我需要在这里找到虚拟仿真时间的单位


再次感谢…

您可以使用
ScheduledExecutorService
模拟离散事件,如

List<Event> events = new ArrayList<Event>();
ScheduledExecutorService executor =  Executors.newScheduledThreadPool(4);
for (Event event : events) {
    executor.schedule(event, (long) event.time, TimeUnit.MILLISECONDS);
}
try {
    executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
    e.printStackTrace();
}

注意:实现
Comparable
,而不是原始
Comparable
。对于时间,我将使用System.nanoTime()(long)和TimeUnit类来表示它们。nanoTime()只是用来测量经过的时间
List<Event> events = new ArrayList<Event>();
events.add(new Event(1000d, () -> System.out.println("event1")));
events.add(new Event(2000d, () -> System.out.println("event2")));
//adding more events ...
Collections.sort(events);

//Fix start time
long start = System.currentTimeMillis();
for (Event event : events) {

    //Wait until event time is <= than current - start time
    while (event.time > System.currentTimeMillis() - start);
    event.run();
}