java - Java(和 SwingUtilities)中的 GUI 线程

标签 java multithreading swing user-interface freeze

我正在使用 Swing 在 Java 中制作一个简单的游戏,并且在按下应该触发 JPanels 中的开关的按钮后,我的 GUI 偶尔会卡住(最有可能是由于线程问题)。

我发布了一个相关主题 here ,其中包含有关我当前使用的实际代码的更多详细信息(尽管我确实更新了倒计时并使其正常工作)。从对该线程的回答来看,似乎使用 SwingUtilities.invokeLater()invokeAndWait()可能是我解决问题所需要的,但我不确定在我的代码中的哪个位置是必要的,或者具体如何实现它。

我不太了解线程,可以使用我可以获得的任何帮助(最好是详细的并带有一些示例代码)。如果任何进一步的细节有用,请告诉我。

最佳答案

见:Tutorial: Concurrency in Swing

一般来说,Eve​​nt Dispatch Thread 是一个单线程,通过事件队列,一次处理一个。

SwingUtilities.invokeLater(..) 

在这个队列上放置一个 Runnable。所以当 EDT 在它之前完成队列上的所有事情时,它将被 EDT 处理(这就是为什么在队列上 hibernate 会阻止其他事件,如重绘)。从 EDT 本身调用 invokeLater(..) 是相对不寻常的,尽管在某些情况下它很有用(通常作为一个 hack)。我认为在过去的 6 年里我没有合法使用 SwingUtilities.invokeAndWait(..)。也许一次。
javax.swing.Timer可以配置为一次或定期触发。当它触发时,它会在 EDT 队列中放置一个事件。如果您需要进行计算密集型处理,请考虑使用 javax.swing.SwingWorker在另一个线程上进行计算,并以线程安全的方式返回结果(这也比较少见)。

关于java - Java(和 SwingUtilities)中的 GUI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9507685/

相关文章:

java - 动态创建多个ImageView

java - 在 Intellij 中调试时运行代码片段

multithreading - 我如何使用 Rayon 将大范围拆分为多个范围 block ,并让每个线程在一个 block 中找到?

java - Swing BoxLayout

java - 设置 JFrame 中可见空间的大小

Java JComboBox 是否可以将 editable true 设置为仅一项?

java - 将 try catch finally block 放入另一个 finally block 中

java - 通过 SOAP/Java 在 MS Dynamics CRM 2011 中创建产品

Java - 使用执行器服务的线程

multithreading - 同步3个线程以打印顺序输出