不断检查时间 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
。 最好只在需要时更新。
所以我在一些我从未完成的旧 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
。 最好只在需要时更新。