我正在尝试模拟实时数据流,以测试不断过滤和计算数据点的程序。主要是我需要确保它符合时机。
每 50 毫秒就会有一个需要计算的新数据点。
因此,我想创建一个独立于 jvm 中当前运行的内容或系统上发生的类似情况的 java 时钟。
所以我的问题有两个:
首先, System.currentTimeMillis() 不会是我想要的,因为它基于 jvm 的打开时间,并且会在系统调用执行时发生。
第二,我如何制作一个将不断运行并始终在 50 毫秒标记上准确触发的线程?
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 )
此机制允许您每 5 秒在 RemindTask 的 run() 方法中执行一次代码(该值在代码中指定)
看一下ScheduledExecutorService
,更具体的scheduleAtFixedRate()
方法。
它允许您定期执行操作。
看看ScheduledExecutorService。这是一个例子:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
//New data point
}
}, 0, 50,TimeUnit.MILLISECONDS );