それぞれにタイムスタンプが付いたイベントの記録を含むテキスト ファイルがあります。ファイルからのデータをリアルタイムでシミュレートするエンジンを作成したいと考えています。最終的に私のプロジェクトはライブ データで動作しますが、テスト フレームワークを作成しようとしています。
言い換えると:
Simulator
スレッド- ファイルを読み取り、タイムスタンプが発生したときにイベントを作成
Worker
スレッド- プロセス データ (これは、本番環境に移行したときに残るコードです)
- イベントハンドオフ/
Notifier
スレッド??? (下記参照)
を実装する最善の方法を見つけようとしていますSimulator
。一度に 1 行ずつ読み取ってから、そのイベントが発生するまでミリ秒数スリープするのは間違っているように思えます。一部のイベントの間隔は 10 ミリ秒未満です。私がやりたいのは、イベントが遠く離れているときに先に進むことができるように、イベントキューを用意することです。これにより、イベントが互いに近くにあるときに実行する処理を最小限に抑えることができます。
おそらくSimulator
実際には 2 つのスレッドである必要があります。1 つはファイルを読み取り、イベントをキューに入れ、もう 1 つはそれらを処理し、ワーク スレッドにイベントを発生させます (上記のNotifier
スレッドを参照)。それは合理的に聞こえますか?以下は、私が考えていることの概要を示すコードです。私は正しい軌道に乗っていますか?ここに含まれていないのは、ファイルを読み取って を作成するスレッドですMyEvent
。
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();
}
}
}
どう思いますか?いいですか、それとも大幅な設計変更を行いますか?