1

我的程序似乎使用了 20% 的 CPU 和大约 1GB 的 RAM。我认为这是因为我正在循环日期。我试图在我的 JFrame 上显示一个时钟(小时、分钟和秒总是在更新)。我的问题是,我怎样才能让我的程序不那么渴望电力?这是我的代码:

while(true){
    Date date = new Date();
    time.setText(date.getHours() + " hours " + date.getMinutes() 
                 + " minutes " + date.getSeconds() + " seconds!");
}
4

4 回答 4

2

不要循环。无论是什么应用程序,上述无限循环都会对资源产生持续的需求。

在这种情况下,您似乎正在使用 Swing。这对应用程序来说更糟Swing。无限循环阻止 UI 更新。

改用Swing Timer并设置一个足够大的周期间隔,以允许观察更新,并减少 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();
            }
        });
    }
}
于 2013-07-29T11:55:26.253 回答
2

避免这种情况,使用SwingTimer,摆动计时器不需要任何循环。

这里有一个完整的例子:

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();
    }
    });

}

}

于 2013-07-29T11:55:38.847 回答
2

如何让我的程序不那么耗电?让你的线程休眠一段时间。我假设给定的代码@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 Timer。

于 2013-07-29T11:58:24.727 回答
0

负载很小的无限循环(设置日期)显然会占用大量 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
}
于 2013-07-29T12:00:06.277 回答