1

データポイントを常にフィルタリングして計算するプログラムをテストするために、ライブデータストリームをシミュレートしようとしています。主に、タイミングが合うようにする必要があります。

50 ミリ秒ごとに、計算が必要な新しいデータ ポイントがあります。

そのため、現在jvmで実行されているものや、システムで発生しているものとは無関係のJavaクロックを作成したいと思います。

だから私の質問は2つあります:

まず、System.currentTimeMillis() は、jvm が開かれたときに基づいているため、ここで必要なものではありません。また、システム コールが実行されるたびに発生します。

第二に、常に実行され、常に 50ms マークで正確にトリガーされるスレッドを作成するにはどうすればよいですか?

4

3 に答える 3

1

Timers と TimerTask には、(純粋なスレッド化と比較して) 事前に定義された非常に優れたメカニズムがあります。

import java.util.Timer;
import java.util.TimerTask;

public class Reminder {
    Timer timer;

    public Reminder(int seconds) {
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000);
    }

    class RemindTask extends TimerTask {
        public void run() {
            System.out.format("Time's up!%n");
            timer.cancel(); //Terminate the timer thread
        }
    }

    public static void main(String args[]) {
        new Reminder(5);
        System.out.format("Task scheduled.%n");
    }
}

(から取得: http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html )

このメカニズムにより、RemindTask の run() メソッドでコードを 5 秒ごとに実行できます (その値はコードで指定されています)。

于 2013-03-22T07:24:59.453 に答える
1

ScheduledExecutorService、より具体的にはメソッドを見てくださいscheduleAtFixedRate()

これにより、一定の間隔で操作を実行できます。

于 2013-03-22T07:25:25.080 に答える
1

ScheduledExecutorServiceを見てください。次に例を示します。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() { 
    //New data point
}
}, 0, 50,TimeUnit.MILLISECONDS );
于 2013-03-22T07:26:07.470 に答える