-1

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

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

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

最终结果看起来像这样

在 Page1.java 的构造函数的末尾,如果我添加while(true) {};或只是while(true);最终结果是这样的:在此处输入图像描述 伴随着一大堆滞后。

根据活动监视器,这是程序占用的空间量:

20 线程
261 端口
近 200% 的 CPU

这个空的while循环怎么会:
a)弄乱已经添加到框架中的JPanel,
b)产生很多滞后?

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

4

6 回答 6

3

因为摆动中的所有 gui 东西都是在EDT中执行的

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

例如

while(true){

 };

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

于 2013-08-03T20:46:04.217 回答
0

这不仅仅是什么都不做。它在循环。当您说“大量滞后”时,我假设您的意思是应用程序完全挂起?如果它在遇到 while() 时执行任何操作,我会感到惊讶。

于 2013-08-03T20:41:01.160 回答
0

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

于 2013-08-03T20:41:08.253 回答
0

一个空的(和无限的)循环实际上做了很多事情——它就像一张纸告诉你要翻一页,在背面它说的也是一样的。

所以永远不要用任何计算机语言做一个空循环。

你可以做的是

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

这更好,因为现在您让主线程运行,但告诉 JVM“好的,我不会在 100 毫秒内做某事,所以如果需要,请做其他事情”。

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

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

于 2013-08-03T20:41:35.917 回答
0

延迟很可能是由于理论上循环被执行了无数次而引起的。也许你可以尝试暂停线程,这让 CPU 有一些时间来呼吸:

Thread.sleep(5);
于 2013-08-03T20:42:05.260 回答
-1

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

于 2015-01-21T05:02:57.687 回答