我一直在搞乱NetBeans创建一个始终位于顶部的时钟,并始终在屏幕的右下角加载。我已经完成了它但是我认为我的代码正在消耗内存,在我离开它过夜之后我又回到了1.4GB的内存并且使用了大量的CPU。我是Java编程的新手,所以我希望这不正常!
在我的主线程中,我每次运行都会创建一个新的Calendar对象。将其移出Thread会创建一个Calendar对象,该对象使用当前时间初始化但从不更新,是否有更好的方法来执行此操作?
我不习惯处理Threads,我想我可能已经扭转了局面。任何人都可以建议改进以下内容,这将降低我的内存占用和CPU使用率吗?
public JavaClockGUI() {
initComponents();
new Thread()
{
public void run()
{
while(true)
{
Calendar cal = new GregorianCalendar();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int min = cal.get(Calendar.MINUTE);
int sec = cal.get(Calendar.SECOND);
String time = String.format("%02d",hour) + ":" + String.format("%02d",min) + ":" + String.format("%02d",sec);
lblTime.setText(time);
}
}
}.start();
}
答案 0 :(得分:0)
尝试在while循环之外声明变量 并且在给定的时间内延迟减少循环的执行。
public void run()
{
Calendar cal;
int hour;
int min;
int sec;
String time;
while(true)
{
cal = new GregorianCalendar();
hour = cal.get(Calendar.HOUR_OF_DAY);
min = cal.get(Calendar.MINUTE);
sec = cal.get(Calendar.SECOND);
String time = String.format("%02d",hour) + ":" + String.format("%02d",min) + ":" + String.format("%02d",sec);
lblTime.setText(time);
//delay the loop for 1 sec
try {
Thread.currentThread().sleep(1000);
System.out.println(x);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 1 :(得分:0)
希望这会对你有所帮助。
Date(){
DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss)";
Date date = new Date();
boolean condition = false;
while(!false){
lbltime.setText(dateFormat.format(date));
Thread.sleep(1000);
}
}
答案 2 :(得分:0)
关于表现的两个重要事项:
while(true)
循环猖獗)。我不知道最佳方式是做什么的,但我有一个简短而准确的方法:
使用Timer
以固定费率执行TimerTask
。方法scheduleAtFixedRate
将以相对于绝对时间的固定速率执行任务(run
方法),而不是相对于先前的执行。也就是说,如果其中一个执行被延迟,则无论延迟如何都会开始下一个(它们将相隔较短)。调用Thread.sleep(1000)
将不会以这种方式运行,并且从长远来看会导致累积延迟。
为了接收时间并格式化它,Java8 Date-Time API(java.time
)是可行的方法。
public class Example {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(LocalTime.now().format(formatter));
}
}, 0, 1000);
}
}
备注强>:
TimerTaks
。DateTimeFormatter
以找到您想要的格式,如果这个格式不是您正在寻找的格式。您可以保留对计时器的引用,
Timer timer = new Timer();
timer.scheduleAtFixedRate(...);
如果您以后需要它。