簡體   English   中英

使用日期時Java程序效率低下

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM