不断检查Java的时间

时间:2015-07-11 06:20:17

标签: java calendar gettime

所以我正在挖掘一些我从未完成过的旧Java项目,我拿出了这个有史以来最好的项目的小数字。

enter image description here

它是一个用java编码的桌面时钟小部件,它除了一件事外它的工作原理非常好。我的方式检查当前保持更新的时间是在一个循环和循环"崩溃"在几秒钟内,小部件就不再获得当前时间。

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

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 是一个我保留大部分变量的课程(我知道它很奇怪,这就像3年前一样,它是我如何使用的写我的节目)。

所以我的主要问题是,是否有一种方法可以阻止循环"崩溃"?

提前致谢!

4 个答案:

答案 0 :(得分:3)

这不是一个循环,真的。这是一个递归调用。在每次递归中,将分配更多的内存,因此它会在一段时间后内存不足。我想知道为什么这只是几秒钟,但无论如何。 尝试使用Timer来安排gui更新。

编辑:您正在每次递归中创建一个新的ImageIcon。它们在记忆中可能相当大。也许他们是快速“崩溃”的原因。

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

答案 1 :(得分:2)

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所说,我认为记忆是你的问题。以这种方式使用计时器,它应该可以解决您的问题。

答案 2 :(得分:0)

这是第一个解决方案

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最好只在需要时更新

答案 3 :(得分:-1)

你的问题的答案是 使用设置超时功能 你想避免循环崩溃。 像:

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