дата возвращается в Java-приложении - PullRequest
0 голосов
/ 11 декабря 2018

я использовал дату в потоке.

, но иногда дата возвращается в обратном порядке.

это пример кода.

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 ]

0 голосов
/ 11 декабря 2018

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>");
    }
}
0 голосов
/ 11 декабря 2018

Существует одна ошибка и концепция, связанная с потоками:

  1. С Print(new Date()); вы создаете новую дату, но вы ее не используете: фактически вы создаете новую_dateFormat.format(new Date()) + ""): вам следует использовать тот, который вы передаете в конструктор, или просто не передавать его в качестве аргумента, если вы его не используете.
  2. Вы работаете с потоками: вы не знаетекакой поток выполняется первым (они асинхронны): скорее всего, в вашем примере первый запуск закончился после второго.Попробуйте добавить имя в свою ветку и напечатать его, это поможет вам понять, какая печать связана с какой нитью
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...