我有一个包含三行的测试文件,每行以秒为单位的时间戳开头。我读了这个时间戳并基于它我安排了一个新的计时器 对于正在读取的每个时间戳。为什么当我运行在下面提到的“processFile”方法中创建的线程时,控制台是否显示三个线程的输出? 一次定时器?我希望看到每个计时器的输出间隔几秒钟的延迟作为我阅读的三行中每一行的时间戳 从文件中分别是 2 秒、15 秒和 7 秒?当我运行程序时,几秒钟后我收到以下“系统时间”输出 尽管从文件中读取的时间戳不同,但立即立即将它们分开!
请告诉我为什么会发生这种情况以及如何解决。
//this method is being called on a worker thread
private static void processFile(File dataFile) throws IOException {
// TODO Auto-generated method stub
System.out.println(WORKER_THREAD + " started.");
logfile = new MeasurementFile(dataFile, MeasurementFile.ENCODING_UTF_8);
System.out.println("Total lines in the file: " + logfile.getTotalLines());
System.out.println("#Parameters/line: " + logfile.getFileHash().get(logfile.getTotalLines()).getFullParameters().length);
System.out.println("Time Stamp in Seconds: " + logfile.getFileHash().get(logfile.getTotalLines()).getTimeStampInSec());
timer = new Timer();
for (int i = 1; i <= logfile.getTotalLines(); i++) {
++currentLine;
t = new Thread(new threadFile(), "logFile_Thread_" + i);
t.start();
}
}
static class threadFile implements Runnable {
public void run() {
timer.schedule(new timedTask(), (long) logfile.getFileHash().get(currentLine).getTimeStampInMilli());
}
}
static class timedTask extends TimerTask {
@Override
public void run() {
// TODO Auto-generated method stub
long nanoTimer = System.nanoTime();
//long milliTimer = System.currentTimeMillis();
System.out.println("systemTime(ns): " + nanoTimer);
}
}
输出:
file processing thread started.
Total lines in the file: 3
#Parameters/line: 9
Time Stamp in Seconds: 7.0
systemTime(ns): 4882255697670
systemTime(ns): 4882255928644
systemTime(ns): 4882255985104
最佳答案
我怀疑 for 循环和其中的计数器以及您创建线程的新实例的方式。 我会那样做。
for (int i = 1; i <= logfile.getTotalLines(); i++) {
t = new Thread(threadFile, "logFile_Thread_" + i);
t.start();
}
static Runnable threadFile = new Runnable() {
public void run() {
// TODO Auto-generated method stub
++currentLine;
timer.schedule(new timedTask(), (long)
logfile.getFileHash().get(currentLine).getTimeStampInMilli());
}
};
因为 for 循环中的计数器将始终获得其最大值,并将应用于所有 Timertasks。换句话说,如果你有一个循环 5 次迭代,计数器将根据计数器的初始化方式获得最大值,然后这个计数器值你用它来解析文件中的特定数据,这意味着你总是得到 frm 的值最后一行然后将其应用于 timerTask
关于java - timerSchedule 不服从启动定时器设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312350/