在Java中不断检查时间

在Java中不断检查时间,java,calendar,gettime,Java,Calendar,Gettime,所以我一直在挖掘一些我从未完成过的旧java项目,我拿出了我有史以来最好的项目中的一小部分 这是一个用java编写的桌面时钟小部件,除了一件事,它工作得非常好。我让它检查保持更新的当前时间的方法是在一个循环中,循环在几秒钟内“崩溃”,因此小部件不再获取当前时间 这就是循环的构造方式(减小大小): global是一个我保存大部分变量的类(我知道这很奇怪,就像3年前一样,我以前就是这样编写程序的) 所以我的主要问题是,有没有一种方法可以防止循环“崩溃” 提前谢谢 这不是一个循环,真的。这是一个递归

所以我一直在挖掘一些我从未完成过的旧java项目,我拿出了我有史以来最好的项目中的一小部分

这是一个用java编写的桌面时钟小部件,除了一件事,它工作得非常好。我让它检查保持更新的当前时间的方法是在一个循环中,循环在几秒钟内“崩溃”,因此小部件不再获取当前时间

这就是循环的构造方式(减小大小):

global
是一个我保存大部分变量的类(我知道这很奇怪,就像3年前一样,我以前就是这样编写程序的)

所以我的主要问题是,有没有一种方法可以防止循环“崩溃”


提前谢谢

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

编辑:在每个递归中创建一个新的ImageIcon。它们的内存可能相当大。也许这就是快速“崩溃”的原因

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

Thread.sleep(1000)不是一个好的选择。你可以用。通过使用
计时器
可以定期安排任务

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

  timer.schedule( new TimerTask() {
       public void run() {
          //do your work;
       }
  }, 0, interval); 
如果要停止调度,可以使用
timer.cancel()


编辑:正如费尔多所说,我认为记忆是你的问题。这样使用计时器,它会解决您的问题。

您的问题的答案是 对函数使用设置超时函数 您希望避免循环崩溃。 比如:

这是第一个解决方案

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){
              //..
           }
         }
       }
     }

注意:您需要在系统时间发生分钟变化时立即开始此操作。否则时钟就会落后。计算
程序启动后,等待\u NEW\u MINUTE
。最好只在需要时更新。

循环不会崩溃。它可能引发异常。在这种情况下,读取异常消息和堆栈跟踪将告诉您和我们问题所在。这比猜测要好得多。请发布完整的异常。我明天就要发布了,上床睡觉了。除了答案中已经提到的明显的无限递归之外,除非你能够发布你得到的异常,或者更精确地定义“崩溃”。如果它不是一个循环,严格来说它不是关于“迭代”,但“递归”;)绝对正确。修复了@hiergiltdiestfuFildor,我猜您要查找的单词是
StackOverflowException
,因为这是一个无限递归。@Tom我们只能推测这是抛出的异常。但由于op没有指定“崩溃”“它也可能是我们从给定的代码中看不到的东西。Java,而不是javascript……我刚刚有机会实现这个解决方案。到目前为止一切都很顺利,我只是想解决另一个图像重叠的小问题。谢谢今晚晚些时候我会更新我的解决方案。
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){
              //..
           }
         }
       }
     }