java - timerSchedule 不服从启动定时器设置?

标签 java timer timertask

我有一个包含三行的测试文件,每行以秒为单位的时间戳开头。我读了这个时间戳并基于它我安排了一个新的计时器 对于正在读取的每个时间戳。为什么当我运行在下面提到的“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/

相关文章:

java - JSP:在mysql查询中执行非英文字符

java - JSOUP - 直接从页面中以特定格式提取数据

c# - 如何让我的控制台应用程序在不退出的情况下在另一个线程上运行后台进程?

java - 如何在这些天的持续时间内多天运行一个方法?

java - 如何为Android资源设置固定id

JQuery & Timer::从网络服务更新超链接的文本

c# - 从 javascript 更改标签文本

java - 从另一个线程调用 timer.cancel() 后,TimerTask 不会立即停止?

android - 如何完全删除可运行计时器?

java - 为什么重写方法不能抛出比重写方法更广泛的异常?