有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

日期在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>

共 (2) 个答案

  1. # 1 楼答案

    有一个错误和一个与线程相关的概念:

    1. 使用Print(new Date());,您正在创建一个新的日期,但您没有使用它:事实上,您正在创建一个新的日期_dateFormat.format(new Date()) + ""):您应该使用在构造函数中传递的日期,或者如果不使用它,就不要将其作为参数传递
    2. 您正在使用线程:您不知道哪个线程作为第一个线程运行(它们是异步的):在您的示例中,很可能第一次运行在第二次运行之后结束。尝试在你的线程中添加一个名字并打印出来,这将帮助你理解哪个打印与哪个线程相关
  2. # 2 楼答案

    Date使用System.currentTimeMillis()它使用你的“挂钟”。这种挂钟不能保证通过单调递增的方式工作,而是通过调整来匹配它可以访问的互联网上的最佳时钟,例如通过NTP

    16秒是一个相当大的时间跳跃,所以我会看看你的NTP是如何设置的。通常情况下,NTP会尝试平滑其修正,但它可能会被迫立即跳到特定时间

    注意:虽然线程之间的竞争条件可能会导致这种行为,但不太可能导致这样的16秒跳变

    要解决争用条件,可以在System.out上保持锁,以确保不会同时尝试写入输出

    private void printTime() {
         synchronized(System.out) {
            System.out.println("<TIME>" + _dateFormat.format(new Date()) + "</TIME>");
        }
    }