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