Java时钟同步

时间:2015-09-04 00:19:35

标签: java multithreading timer

我必须在新德里,香港,法兰克福,华盛顿等不同地方的屏幕上显示多个时钟。这些时间正在像其他任何真正的时钟一样发生变化,但是时间到了固定的日期 - 时间和他们当用户添加它们时,会在不同时刻添加到屏幕上。例如:

New Delhi       1d 4h 20 min 5s
Hong Kong       9h 2min 55s
Washington      22min 3s
...

我有一个Class,它使得所有计算以这种格式获得那些时间。当这些时间显示在屏幕上时出现问题。如何让他们同时更新时间?因此,秒中的所有更改都会同时显示。我知道理论上它不会在同一时间,但最接近它。这是我正在使用的计时器:

Timer t = new Timer();   
t.scheduleAtFixedRate(
    new TimerTask()
    {
        public void run() {
          Platform.runLater(new Runnable() {
              @Override
              public void run() {
                  label[id].setText(getTimeLeft(id));
              }
          });
        }
    },
    0,      // run first occurrence immediately
    1000);  // run every seconds

此外,他们中的一些最终冻结。有没有人知道为什么?

1 个答案:

答案 0 :(得分:5)

  

如何让他们同时更新时间?因此,秒中的所有更改都会同时显示。我知道它在理论上不会在同一时间,但最接近它。这是我正在使用的计时器:

不是为每个标签使用单独的Timer,而是为所有标签使用单个Timer

Timer t = new Timer();   
t.scheduleAtFixedRate(
    new TimerTask()
    {
        public void run() {
          Platform.runLater(new Runnable() {
              @Override
              public void run() {
                  for (int id = 0; id < label.length; id++) {
                      label[id].setText(getTimeLeft(id));
                  }
              }
          });
        }
    },
    0,      // run first occurrence immediately
    1000);  // run every seconds

这将减少您系统上的资源开销(一个计时器而不是n次),可能的事件队列发送垃圾邮件,因为多个计时器同时触发,并允许时间到#34;似乎&#34;同时更新,因为它们都在事件队列中更新,因此它们不会更新,直到下一个绘制周期,直到你退出运行块为止不会发生......

您还可以使用Timeline,这样可以减少对Platform.runLater的需求,请参阅How to update the label box every 2 seconds in java fx?作为示例。