我的台式电脑没有互联网连接或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秒的差异。基本上它不准确。
还有其他方法吗?
答案 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可能发生的溢出。