日期在java应用程序中反向流动
我已经习惯了约会
但有时,日期会倒流
这是示例代码
private class Test extends Thread
{
private DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
public Test()
{
// Start Thread
}
private void Print(Date date)
{
System.out.println("<TIME>" + _dateFormat.format(new Date()) + "");
}
public void run()
{
// Works In Thread.
Print(new Date());
Print(new Date());
}
}
这是怎么回事
结果:
<TIME>2018-11-13 05:02:16.860</TIME>
<TIME>2018-11-13 05:01:58.235</TIME>
# 1 楼答案
有一个错误和一个与线程相关的概念:
Print(new Date());
,您正在创建一个新的日期,但您没有使用它:事实上,您正在创建一个新的日期_dateFormat.format(new Date()) + "")
:您应该使用在构造函数中传递的日期,或者如果不使用它,就不要将其作为参数传递李># 2 楼答案
Date
使用System.currentTimeMillis()
它使用你的“挂钟”。这种挂钟不能保证通过单调递增的方式工作,而是通过调整来匹配它可以访问的互联网上的最佳时钟,例如通过NTP16秒是一个相当大的时间跳跃,所以我会看看你的NTP是如何设置的。通常情况下,NTP会尝试平滑其修正,但它可能会被迫立即跳到特定时间
注意:虽然线程之间的竞争条件可能会导致这种行为,但不太可能导致这样的16秒跳变
要解决争用条件,可以在
System.out
上保持锁,以确保不会同时尝试写入输出