当前位置: 首页 > 面试题库 >

在事件调度线程上构造SWING / AWT小部件是否安全?

东门修文
2023-03-14
问题内容

我一直在将Substance外观整合到我的应用程序中,并且遇到有关内部EDT(事件调度线程)检查例程的一些问题。物质绝对拒绝在EDT之外构造UI类。我已经做了很多Swing / AWT,并且我了解有关EDT的大多数规则。我使用SwingWorker,SwingUtilties.invokeLater修改组件。我总是尽管可以在EDT之外构造这些组件,但是必须在EDT上实现和操纵这些组件。换句话说,你可以在后台构造和设置默认值,但是对pack / setVisible的调用必须是EDT,以及随后的任何操作该组件的调用。

我问的原因是,我要构建一个特别的“漂亮”窗口,其中涉及许多小部件,状态和资源(很多图标)。以前,我是在SwingWorker的背景方法上构建窗口的,并在done方法中使该窗口可见。从来没有一个问题。切换到Substance后,内部EDT检查将我咬了。

我已经能够重构代码来解决这个问题。我可以在EDT上构建一个不好的解决方案,因为整个应用程序都会阻塞。我还可以进行更多重构,并尽力将所有额外的资源加载到EDT之外。

包装起来… 在事件调度线程上构造 SWING / AWT小部件是否安全?


问题答案:

为了避免发生死锁,你必须格外小心,仅从事件调度线程创建,修改和查询Swing组件和模型。

请注意,所有正式的Sun 示例都已重写,并且对此非常严格。

可能是多核计算机作为台式机的可用性不断提高,从而重新制定了规则-线程问题在客户端堆栈上变得越来越明显,并且由于对EDT指南的要求非常严格,很多他们可以从一开始就被阻止。



 类似资料:
  • Java Swing教程使用SwingUtilities。invokeLater创建GUI(如这里所示)。这里解释了为什么要这样做——大多数Swing对象都不是线程安全的。另一方面,我所看到的大多数JRubySwing示例只是设置了脚本中可见的顶部框架(如这里所示——归档中的“gui”目录)。 问题是,在 JRuby 脚本中创建应用程序顶部帧时,我是否应该遵循使用 SwingUtilities.i

  • 问题内容: 我知道“线程”的含义,并且如果我将事件分发线程(EDT)理解为“只是一个线程”,它可以解释很多,但是显然,它并不能解释所有内容。 我不了解此线程有什么特别之处。例如,我不明白为什么要在EDT中启动GUI?为什么“主”线程是GUI的床?好吧,如果我们只是不想占用主线程,为什么为什么不能仅在“另一个线程”中启动GUI,为什么它应该是一些称为“ EDT”的“特殊”线程呢? 那我不明白为什么我

  • 问题内容: 我最近开始学习和探索Java中GUI编程的基础知识。 经过一段时间的编程,我只完成了后端工作或其他工作,因此,我最接近用户界面的是命令控制台(令人尴尬的是,我知道)。 我正在使用Swing,据我所知,通过扩展,我也正在使用AWT。 我的问题基于以下代码: 我已经研究了一段时间,因为我想完全理解这段奇怪的代码,并且多次遇到“事件分派线程”一词。如果我错了,请纠正我,但据我了解;它与使用多

  • 问题内容: 根据Swing教程: 一些Swing组件方法在API规范中被标记为“线程安全”。这些可以从任何线程安全地调用。所有其他Swing组件方法都必须从事件分发线程中调用。忽略此规则的程序在大多数情况下都可以正常运行,但是会遇到难以预料的错误,这些错误很难重现。 但是这些标记为“线程安全”的Swing组件方法是什么?真的有吗? 更新/赏金: 是否有线程安全的摆动方法的 完整列表 ?(线程安全的

  • 主要内容:什么是 EventObject 事件对象,EventObject 事件类的声明,EventObject 事件类的构造方法,EventObject 事件类的方法,常用的 EventObject 事件类什么是 EventObject 事件对象 Event 类代表事件。Java 为我们提供了各种 Event 类,但我们将讨论那些更常用的类。 EventObject 事件对象是所有事件状态对象都应从中派生的根类。所有事件都使用对对象的引用来构造,源在逻辑上被认为是最初发生有问题的事件的对象。此

  • 问题内容: 我了解了swing是不是线程安全的。深入研究,我发现必须对事件分发线程进行任何对swing组件的修改,以防止与多线程相关的各种问题。但是,这些信息似乎完全到此为止。似乎没有一个很好的教程可以解释如何在Internet上可以访问的任何地方进行此操作。 从与其他问题有关的已发布代码中收集信息,似乎我将不得不在程序中的每个单独的swing修改周围放置一个不整洁的代码块(例如本例中的代码):