Java中的离散事件模拟时间单元
我正在用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
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();
}