为什么这个空的while循环导致滞后?

时间:2013-08-03 20:37:39

标签: java swing

我有一个JFrame构造函数,从Main.java调用(JFrame的类是Page1.java)

movieSelection p1 = new movieSelection();
this.add(p1);
this.pack();
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);

movieChoose是一个扩展JPanel的类,是Page1的子类。它由一个构造函数和一个带有ActionListener的JButton组成,该构造函数添加了一个JTextField。

最终结果如下

在Page1.java的构造函数结束时,如果我添加while(true) {};或仅while(true);,最终结果为:enter image description here以及大量延迟。

根据活动监测,这是该计划占用多少空间:

20个线程
261个港口
近200%的CPU

这个空循环如何循环:a)弄清楚已添加到框架中的JPanel,以及b)产生大量延迟?

为什么一个什么都不做的循环会做什么?

6 个答案:

答案 0 :(得分:2)

因为在EDT

中执行了挥杆中的所有gui内容

如果你用繁重的任务阻止这个线程

例如

while(true){

 };

然后gui冻结直到完成,但代码永远不会结束所以永远不会完成所以永远不能渲染gui。

答案 1 :(得分:0)

这不仅仅是无所事事。它在循环。当你说“很多滞后”时,我认为你的意思是应用程序完全挂起?如果它在遇到while()时发生任何事情,我会感到惊讶。

答案 2 :(得分:0)

因为该循环永远不会停止检查值是否为真... 这就是为什么它被称为无限循环。每个循环用于检查它是否应该停止循环。

答案 3 :(得分:0)

一个空的(无限的)循环实际上做了很多 - 就像一张纸告诉你翻页,而背面也是这样。

所以永远不要用任何计算机语言进行空循环。

你能做的就像是

 while (true) {
    Thread.sleep(100);
 }

那更好,因为现在你让你的主线程运行但告诉JVM“好吧,我不打算做100毫秒的事情,所以如果你需要做其他事情。”

但是你仍然错过了一件重要的事情 - 一些退出条件。

为什么你需要一个无限循环呢?在普通的swing应用程序中,不需要保持主线程运行,JFrame打开就足够了。您可以在http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html

看到一些示例代码

答案 4 :(得分:0)

滞后很可能是因为理论上循环执行无限次。也许你可以尝试暂停线程,这给了CPU一些时间来呼吸:

Thread.sleep(5);

答案 5 :(得分:-1)

很老,所以可能不读,但谢谢!回答了一个最棘手的问题。 (之前我正在使用双核处理器,现在切换到单个,我的空{}语句刚刚停止工作!)