NTP服务器不使用系统时间

时间:2015-03-10 10:18:45

标签: java time ntp

我的台式电脑没有互联网连接或GPS接收器。我需要构建一个NTP服务器应用程序,最好是在JAVA中,而不需要使用系统时间。

我使用了以下方法。

public void run() 
    {
        Date oDate = new Date();
        time = oDate.getTime();

        System.out.println("Syst Time--->"+oDateFormat.format(time));
        while(true)
        {
            try 
            {
                Thread.sleep(100);
                time = time+100;
                oDate = new Date();
                if(time % 11443 == 1)
                {
                    System.out.println("Time--->"+oDateFormat.format(time)+" Syst Time--->"+oDateFormat.format(oDate));
                    oDate = null;
                }
            } 
            catch (InterruptedException ex) 
            {
                Logger.getLogger(NTPServer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

我正在做的是有一个线程可以休眠100毫秒,之后我会在 time 变量中加100,这样可以节省我的时间。 但每次打印时,它会与系统时间产生2-3秒的差异。基本上它不准确。

还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

使用Thread.sleep(100);无法确保您的循环每100毫秒精确执行一次。至少有两件事需要考虑:

  • Thread.sleep(100)调用之间执行的代码本身需要一段时间才能执行。
  • Thread.sleep(100)不会完全 100毫秒,但它至少 100毫秒。在Thread.sleep()未定义后,您的程序真正继续,并依赖于实施定义的方面,如VM调度程序和OS调度程序。

在具有非确定性计时行为的环境中,软件无法测量时间。非确定性计时行为是由调度程序,缓存,多任务处理,多线程,硬盘等引起的。

您必须使用System.currentTimeMillis()System.nanoTime()来依赖系统时间。

答案 1 :(得分:0)

您可以根据文档使用System.nanoTime()

  

此方法只能用于测量经过的时间而不是   与系统或挂钟时间的任何其他概念有关。

因此,您不会违反使用系统时间的要求。然后你基本上需要做以下事情:

long before = System.nanoTime();
Thread.sleep(100);
long after = System.nanoTime();
time = time+((after-before)/1000000L);

您的生产代码应该知道在睡眠期间nanoTime可能发生的溢出。