Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不使用系统时间的NTP服务器_Java_Time_Ntp - Fatal编程技术网

Java 不使用系统时间的NTP服务器

Java 不使用系统时间的NTP服务器,java,time,ntp,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(tru

我有一台没有互联网连接或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毫秒,之后我将100添加到保持时间的time变量中。 但每次打印时,它都会与系统时间相差2-3秒。基本上它不准确

还有别的办法吗

您可以根据文档使用:

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

因此,在使用系统时间时不会违反您的要求。然后您基本上需要执行以下操作:

long before = System.nanoTime();
Thread.sleep(100);
long after = System.nanoTime();
time = time+((after-before)/1000000L);
生产代码应该知道在睡眠期间nanoTime可能发生的溢出。

使用
Thread.sleep(100)
不会确保每100毫秒执行一次循环。至少有两件事需要考虑:

  • 在调用
    Thread.sleep(100)
    之间执行的代码本身需要时间
  • Thread.sleep(100)
    不能精确睡眠100毫秒,但至少睡眠100毫秒。当程序在
    线程之后真正继续运行时。sleep()
    未定义,取决于实现定义的方面,如VM调度程序和OS调度程序
在时间行为不确定的环境中,软件无法测量时间。非确定性定时行为是由调度器、缓存、多任务、多线程、硬盘等引起的


您必须依赖于系统时间,使用
system.currentTimeMillis()
system.nanoTime()

仅仅依赖sleep()是不够精确的。难道你不能以系统时间为基准,将系统时间和GPS时间之间的差异存储为偏移量,并在需要时计算出实时时间吗?当您每隔几秒钟或几分钟更新一次偏移量时,即使系统时间漂移严重,您也应该可以。实际上
new Date()
已经在使用系统时间。@SpaceTrucker是的,我假设系统时间第一次是正确的,然后它就漂移了。所以我先从系统中获取正确的时间,然后试图阻止它漂移。@ThomasStets,但偏移量是静态的,对吗?漂移是每小时一秒,相当大。所以,假设我一开始得到1秒的偏移量,我不能在一天结束时减少太多偏移量。@Tattu抱歉,我似乎没有足够仔细地阅读你的问题。我读到你有GPS数据,而你却说没有。系统时间漂移是否为常数,即始终为每小时1秒?如果你知道你第一次阅读是多久以前,你就可以弥补这一点。如果漂移本身波动,你就不走运了。即使您设法从sleep()获取一些有意义的信息,此方法本身也依赖于系统时钟。也许这可以帮助你调整你的时钟(如果你运行Linux):是的,我知道关于睡眠(int),但我只是想评估一下漂移是如何进行的。这行不通。这就是我发布寻求帮助的原因:)我的目标是最大限度地减少时间漂移,比如说一周一秒钟或者其他时间。但我觉得你是对的,这似乎很难。