|
|
1
3
从“没什么”到“间歇性问题”,再到“一切都坏了,把所有人都拉到图形用户界面上工作!” 主要(最明显)的视觉效果是,如果您按住GUI线程(就像某人按下按钮,然后您进行睡眠(5000)或其他操作),您的GUI将不会重新绘制。不能,因为你抓住了唯一允许你通过的线!这使得人们认为Java真的很慢。这并不坏,但它很容易编程,许多人谁不费心研究这样的做法已经产生了航运产品。 下一个最大的问题是,当您在另一个线程中绘制屏幕时(比如传递给main的线程),它可能会有奇怪的行为。Swing对于如何渲染帧已经过于挑剔了——去掉线程作为变量! 最后,很少(或者经常是在错误线程的紧密循环中调用Swing组件)会发生线程冲突。如果发生这种情况,可能会抛出一个异常(或不抛出),某些东西可能会出错,但这可能并不明显。 |
|
|
2
3
1)有时从Swing线程外部进行所有这些调用是合法的吗? 有一些例外(例如,设置文本字段的文本值是否为您自动进行EDT代理)——但是 不 最好这样做的情况。如果您正在执行大量更新,那么可以在单个EDT调用(对invokeRelater()的单个调用)中完成所有更新,而不是单个调用——但即使是这种批处理也很少有帮助。长和短:对来自EDT的回转部件执行操作。包括读和写。 2)对Swing线程有什么影响?为什么当我从外部调用时,UI的响应性会降低? 嗯,EDT负责更新GUI。如果从外部调用,它不会“反应迟钝”——实际上更新用户界面的低级系统调用根本不会发生。您的应用程序中可能发生的事情是,最初的开发人员很幸运,在Swing组件中改变了状态,而不会造成非常恶劣的竞争条件。然后,其他一些事件导致在EDT上重新喷漆,从而导致组件被更新。这可能看起来是“缺乏响应能力”,但真正发生的是“缺乏屏幕刷新”。 EDT只是一个普通的线程,但是它有点特别,因为它在处理与GUI相关的信号(例如draw命令)的紧密循环中运行。在EDT上发布这些类型的命令的语义与我们通常认为的Java线程(它涉及向消息泵提交操作)真的不同。 长和短——所有那些说“只与EDT上的Swing对象交互”的javadocs都是有原因的。别乱来。如果您想进行后台处理,很好,但是您要负责将与J*组件的交互代理回EDT(通常使用invokelater())。 |
|
|
3
2
幸运的是,这听起来是正确的做法是最适合你。:) Sun曾经说过,可以将其他线程与尚未实现但后来被放弃的组件一起使用: Related stackoverflow question 查看Sun关于Swing和并发性的UI教程(我会发布链接,但这是我在StackOverflow0上的第一个答案)。 |
|
4
1
基本问题是非线程安全对象是以多线程方式执行的。即使是像阅读
(顺便说一句:这是awt的事件调度线程,而不是swing线程。) |
|
|
5
1
对于(1)作为经验法则,必须从 Event Dispatching Thread (EDT) . 如果某些JVM可以接受地处理来自EDT外部的更新,则您不应依赖于此工作,某些机器和不同的外观和感觉将无法接受工作。这种行为是未定义的——这可以解释你所看到的缺乏反应性。 |
|
|
Jörg · 如何更改多行JButton中的行距 1 年前 |
|
|
Clive Galway · 将摆动元件包装在面板顶部 1 年前 |
|
|
AlexHomeBrew · 如何将图像放在左上角的滚动窗格中 2 年前 |
|
|
Vithor Roder · Java CellEditor 2 年前 |
|
|
Dromlius · JPanel透支重叠的JComcoBox 2 年前 |