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