Java中的简单时钟与JFrame

时间:2015-05-07 08:32:54

标签: java multithreading swing

我一直在搞乱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();
}

3 个答案:

答案 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(...);
    

    如果您以后需要它。