我有一个包含事件记录的文本文件,每个事件都有一个时间戳。我想创建一个实时模拟文件数据的引擎。最终我的项目将使用实时数据,但我正在尝试创建一个测试框架。
换句话说:
Simulator
线- 读取文件,在时间戳发生时创建事件
Worker
线- 流程数据(这是我们去生产时会保留的代码)
- 事件切换/
Notifier
线程???(见下文)
我试图弄清楚如何最好地实施Simulator
. 一次读取一行,然后在该事件发生之前休眠几毫秒,这对我来说似乎是错误的。有些事件相隔不到 10 毫秒。我想做的是有一个事件队列,这样当事件相距很远时我就可以领先,这样当它们彼此靠近时我要做的处理最少。
也许Simulator
真的应该是 2 个线程,一个读取文件并将事件放入队列,另一个处理它们并将事件触发到工作线程(见上文,Notifier
线程)。这听起来合理吗?下面是一些代码,概述了我的想法。我在正确的轨道上吗?这里不包括读取文件并创建MyEvent
s 的线程。
public class Notifier implements Runnable {
private long firstStartTime;
private long realStartTime;
private Worker theWorker;
public void run() {
while(true) {
if (eventQueue.peek().getTriggerTime() - this.firstStartTime >=
System.currentTimeMillis() - this.realStartTime) {
GlobalQueue.getInstance().offer(eventQueue.poll());
theWorker.notify();
}
}
}
}
public class GlobalQueue implements Queue<MyEvent> {
private Queue<MyEvent> myQueue;
private static GlobalQueue _instance = new GlobalQueue();
private GlobalQueue() {
myQueue = new LinkedList<MyEvent>();
}
public static getInstance() { return _instance; }
}
public class Worker implements Observer, Runnable {
public void run() {
while(true) {
if(events.peek() != null) {
MyEvent event = GlobalQueue.getInstance().poll();
// handle the event
}
wait();
}
}
}
你怎么看?好,或者你会做出重大的设计改变?