不断检查时间 Java

Constantly check time in Java

所以我在一些我从未完成的旧 java 项目中进行挖掘,然后我提取了这个小数字,这是我有史以来最好的项目。

这是一个用 java 编码的桌面时钟小部件,除了一件事外,它工作得很好。我让它检查当前时间以保持更新的方式是在一个循环中,循环 "crashes" 在几秒钟内,所以小部件不再获取当前时间。

这是循环的构造方式(尺寸缩小):

public class getCurrentTime {
    public static void getTime() throws InterruptedException {
        int hour = global.calendar.get(Calendar.HOUR);
        int minute = global.calendar2.get(Calendar.MINUTE);

        if(hour == 0) {
            global.hour.setIcon(new ImageIcon("resources/hours/12.png"));
        }else if(hour == 23) {
            global.hour.setIcon(new ImageIcon("resources/hours/11.png"));
        }else {
            global.hour.setText("?");
        }

        if(minute == 0) {
            global.minute.setIcon(new ImageIcon("resources/minutes/00.png"));
        }else if(minute == 59) {
            global.minute.setIcon(new ImageIcon("resources/minutes/59.png"));
        }else {
            global.minute.setText("?");
        }
        Thread.sleep(1000);
        getTime();
    }
}

global 是一个 class ,我在其中保留了大部分变量(我知道这很奇怪,就像 3 年前一样,这就是我的方式用来写我的程序)。

所以我的主要问题是,有什么方法可以防止循环 "crashing"?

提前致谢!

这不是循环,真的。这是一个递归调用。在每次递归中,都会分配更多的内存,所以一段时间后它会耗尽内存。我想知道为什么这是几秒钟的问题,但无论如何。 尝试使用计时器来安排 gui 更新。

编辑:您将在每次递归中创建一个新的 ImageIcon。它们的内存可能相当大。也许他们是快速"crash".

的原因

除此之外,我建议坚持 java 命名约定。 Class 名称应以大写字母开头。

Thread.sleep(1000); 不是一个好的选择。您可以使用 Timer。通过使用 Timer,您可以定期安排任务。

  Timer timer = new Timer();
  long interval = (1000) ; // 1 sec

  timer.schedule( new TimerTask() {
       public void run() {
          //do your work;
       }
  }, 0, interval); 

如果要停止调度,可以使用timer.cancel();

编辑:正如 Fildor 所说,我认为内存是您的问题。这样使用定时器,应该可以解决你的问题。

你的问题的答案是 为函数使用设置超时函数 你想避免循环崩溃。 喜欢:

setTimeout(function()  {
    // write the logic
},1000);

这是第一个解决方案

class clockUpdater implements Runnable {

   @Override
   public void run() {
      Thread.sleep(WAIT_TILL_NEW_MINUTE);
      while(true){ //a infinite loop    
      // the Swing call below must be queued onto the Swing event thread
      SwingUtilities.invokeLater(new Runnable(){
         @Override
         public void run() {            
            //your clock updating code here
         }
      });
      try {
         Thread.sleep(1000*60);//you only need to update once after a minute
      } catch (InterruptedException e) {
        // ....
      }
     }
   }
}

这是第二个

class clockUpdater extends Thread{
  @Override

      public void run(){
         Thread.sleep(WAIT_TILL_NEW_MINUTE);
         while(true){
         try{
             //your update code here
             Thread.sleep(60*1000)//
             }
          catch(Exception e){
              //..
           }
         }
       }
     }

注意:您需要在系统时间的分钟更改后立即启动它。否则时钟时间会滞后。程序启动后立即计算 WAIT_TILL_NEW_MINUTE最好只在需要时更新