[英]Inefficient Java program when using date
我的程序似乎正在使用20%的CPU和大約1GB的RAM。 我認為是因為我要安排日期。 我試圖使時鍾出現在我的JFrame上(小時,分鍾和秒總是更新)。 我的問題是,如何減少程序對電源的需求? 這是我的代碼:
while(true){
Date date = new Date();
time.setText(date.getHours() + " hours " + date.getMinutes()
+ " minutes " + date.getSeconds() + " seconds!");
}
不要循環。 無論使用什么應用,上述無限循環都會對資源產生持續的需求。
在這種情況下,您似乎正在使用Swing。 對於Swing
應用程序,這甚至更糟。 無限循環會阻止UI更新。
請改用Swing計時器,並設置一個足夠大的周期間隔,這樣就可以觀察到更新,並要求CPU減少開銷。 應該做到1000
毫秒。
public class TimerDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Timer Demo");
final JLabel timeLabel =
new JLabel("-----------------------------------------------");
Timer timer = new Timer(1000, new ActionListener() {
SimpleDateFormat format = new SimpleDateFormat("HH' hours 'mm' minutes 'ss' seconds'");
@Override
public void actionPerformed(ActionEvent e) {
Date date = new Date();
timeLabel.setText(format.format(date));
}
});
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(timeLabel);
frame.setVisible(true);
frame.pack();
timer.start();
}
});
}
}
避免這種情況,使用SwingTimer ,swing計時器不需要任何循環。
這里是一個完整的例子:
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class DateAndTimer extends JFrame {
private javax.swing.Timer timer;
private JLabel label ;
private Date ;
public DateAndTimer(){
this.timer = new javax.swing.Timer(1000,getActionTimer());
date = new Date();
label = new JLabel();
add(label,BorderLayout.PAGE_START);
timer.start();
setDefaultCloseOperation(3);
setVisible(true);
pack();
}
public ActionListener getActionTimer(){
ActionListener action = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
label.setText(date.getHours() + " hours " + date.getMinutes()
+ " minutes " + date.getSeconds() + " seconds!");
}
};
return action;
}
public static void main(String...args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new DateAndTimer();
}
});
}
}
如何減少程序對電源的需求? 使您的線程休眠一會兒。 我假設給定的代碼@ Cj1m在新啟動的線程中運行。
參見java.lang.Thread.sleep(long)
while(true){
SwingUtilities.invokeLater(new Runnable(){ // make sure to run in EDT
@Override
public void run(){
Date date = new Date();
time.setText(date.getHours() + " hours " + date.getMinutes()
+ " minutes " + date.getSeconds() + " seconds!");
}
});
try {
Thread.sleep(1000); // Sleep for 1000 milliseconds.
// Give a shorter interval if you like.
} catch(InterruptedException e) { // Who interrupted my dream?
e.printStackTrace();
}
}
或使用其他描述的Swing計時器。
負載很小(設置日期)的無限循環顯然會占用大量CPU,而引入sleep
會減少CPU使用率:
while(true){
Date date = new Date();
time.setText(date.getHours() + " hours " + date.getMinutes()
+ " minutes " + date.getSeconds() + " seconds!");
Thread.sleep(1000);//1second update of clock
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.