1

我正在尝试模拟实时数据流,以测试不断过滤和计算数据点的程序。主要是我需要确保它符合时机。

每 50 毫秒就会有一个需要计算的新数据点。

因此,我想创建一个独立于 jvm 中当前运行的内容或系统上发生的类似情况的 java 时钟。

所以我的问题有两个:

首先, System.currentTimeMillis() 不会是我想要的,因为它基于 jvm 的打开时间,并且会在系统调用执行时发生。

第二,我如何制作一个将不断运行并始终在 50 毫秒标记上准确触发的线程?

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 )

此机制允许您每 5 秒在 RemindTask 的 run() 方法中执行一次代码(该值在代码中指定)

于 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 回答