1

我有一个包含事件记录的文本文件,每个事件都有一个时间戳。我想创建一个实时模拟文件数据的引擎。最终我的项目将使用实时数据,但我正在尝试创建一个测试框架。

换句话说:

  1. Simulator线
    • 读取文件,在时间戳发生时创建事件
  2. Worker线
    • 流程数据(这是我们去生产时会保留的代码)
  3. 事件切换/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();
        }
    }
}

你怎么看?好,或者你会做出重大的设计改变?

4

1 回答 1

1

使用 Timer 最重要的是有一个 TimerTask 能够在涉及到它时触发您的事件:

public class EventFirer extends TimerTask {
    private final MyEvent event;

    public EventFirer(MyEvent event) {
        this.event = event;
    }

    public void run() {
        event.fire();
    }
}

现在您只需将所有 EventFirers 放入 Timer 中:

public Timer fillTimer(List<Date> firingTimes) {
    Timer timer = new Timer();
    for (Date whenToFire: firingTimes) {
        timer.schedule(new EventFirer(new MyEvent()), whenToFire);
    }
    return timer;
}

然后让 Timer 完成其余的工作......事实上 Timer 将成为 Simulator 线程。当然在内部它有它的线程。但是我不知道它的时间是否足够准确,可以满足您的需要。我只在第二次或多或少无关紧要的情况下使用它。而且我认为它会计算到下一个事件之前的睡眠时间。因此,它应该与您的解决方案一样准确。

于 2012-10-31T22:01:15.203 回答