【发布时间】:2012-10-21 10:29:03
【问题描述】:
我有一个包含事件记录的文本文件,每个事件都有一个时间戳。我想创建一个实时模拟文件数据的引擎。最终我的项目将使用实时数据,但我正在尝试创建一个测试框架。
换句话说:
-
Simulator线程- 读取文件,时间戳发生时创建事件
-
Worker线程- 流程数据(这是我们去生产时会保留的代码)
- 事件切换/
Notifier线程??? (见下文)
我正在尝试找出如何最好地实现Simulator。一次读一行,然后在该事件发生之前休眠几毫秒,这对我来说似乎是错误的。有些事件相隔不到 10 毫秒。我想做的是有一个事件队列,这样当事件相距很远时我就可以领先,这样当它们彼此靠近时我要做的处理最少。
也许Simulator 实际上应该是 2 个线程,一个读取文件并将事件放入队列中,另一个处理它们并将事件触发到工作线程(见上文,Notifier 线程)。这听起来合理吗?下面是一些代码,概述了我的想法。我在正确的轨道上吗?这里不包括读取文件并创建MyEvents 的线程。
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();
}
}
}
你怎么看?很好,或者你会做出重大的设计改变吗?
【问题讨论】:
-
你试过Timer吗?我认为这里很合适。
标签: java multithreading time observer-pattern simulator