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

SwingUtilities中的invokeAndWait方法

段干楚青
2023-03-14
问题内容

请解释SwingUtilities中的invokeAndWait()方法,对此我无法理解。 非常清楚地解释它。
如果您尝试使用示例,那将有很大的帮助。

编辑以添加@noob扩展问题:

什么是不太清楚这个?

这是修改后的用法示例:

import javax.swing.SwingUtilities;

public class InvokeAndWaitStuff 
{
    public static void main(String[] args)
    {
        final Runnable doHelloWorld = new Runnable() {
             public void run() {
                 System.out.println("Hello World on " + Thread.currentThread());
             }
         };

         Thread appThread = new Thread() {
             public void run() {
                 try {
                     SwingUtilities.invokeAndWait(doHelloWorld);
                 }
                 catch (Exception e) {
                     e.printStackTrace();
                 }
                 System.out.println("Finished on " + Thread.currentThread());
             }
         };
         appThread.start();
    }
}

输出:

Hello World on Thread[AWT-EventQueue-0,6,main]
Finished on Thread[Thread-0,5,main]

为什么这很重要?:

使doHelloWorld.run()在AWT事件分配线程上同步执行。该调用将阻塞,直到处理完所有未决的AWT事件,然后再返回doHelloWorld.run()。当应用程序线程需要更新GUI时,应使用此方法。

据我所知,这基本上是一个瓶颈,迫使GUI更新必须由单个线程同步执行,而不是由多个线程异步执行,这可能是不安全的。


问题答案:

要了解其invokeAndWait()作用,您首先需要了解Swing的事件/线程模型。

基本上, 任何以任何方式影响GUI的事物都必须在单个线程上发生 。这是因为经验表明,多线程GUI无法正确实现。

在Swing中,此特殊的GUI线程称为“事件调度线程”或EDT 。它在显示Swing顶级组件后立即启动,并且
基本上是一个工作线程,该线程具有事件对象的FIFO队列,并逐个执行。

当需要绘制或更新Swing
GUI时,JRE将事件放在EDT队列上。导致调用侦听器的用户操作从EDT队列上的事件开始。并且(这是重要的部分)您的程序所做的所有更改GUI的操作(例如注册侦听器,添加/删除GUI组件或更改GUI显示的模型数据)都必须放在EDT队列中,否则GUI可以获取损坏了。

现在结束: invokeAndWait()
Runnable您传递给它的EDT事件队列中,等待EDT执行它。
当非GUI线程需要执行一些会影响GUI的操作时,还需要等到它实际完成后,才能继续使用它。如果您只想做一些会影响GUI的事情,但不在乎它何时完成,则应改用invokeLater()



 类似资料:
  • 问题内容: 我以前的问题有一个问题。我在代码库的其他地方也有代码,但是删除此gui不会刷新。如果我不删除它,我得到的错误是: HumanPlayer.act中的代码是: 在屏幕调试时无法绘制线程图像: 替代文本http://img684.imageshack.us/img684/6669/69288941.png 堆栈的文本版本: 问题答案: 答案不是打电话 从EDT中使它在新的(非EDT)线程上

  • 问题内容: 我想知道为什么他们在Java中设计方法来接受数组的输入? 在我看来,他们不需要此输入,因为ArrayList实例本身具有足够的详细信息以将数据转换为数组。 我的问题是为什么他们仍然需要传递数组?谢谢。 问题答案: 我能想到的两个原因: 删除表示通用参数在运行时不可用,因此不 知道 它包含字符串,而只是原始类型。因此,所有对的调用都必须返回,这并不是严格正确的。您实际上必须创建第二个数组

  • 问题内容: Object类中的getClass方法如何能够动态返回Class? 问题答案: 它不返回类 名 -返回代表该对象类型的类型。每个对象都“知道”它实际上是什么类型- 这取决于执行时间类型,即强制转换如何工作或失败。只是从对象中检索相关信息。 如果您的类仅包含一个,则每个对象仍将在内存中占用4个以上的字节:有效地存在一个对象“标头”,其中包含对对象的实际类型的引用,与监视器关联的信息该对象

  • 问题内容: 因此,我对Java枚举中是否可以包含函数感到困惑。我正在制作一个简单的html编辑器,并希望使用枚举来表示html标签,是的,我知道这不是解决问题的最佳方法,而是我小组决定实现它的方法。 所以我一直在尝试做这样的事情,但是当我试图称其为静态方法时,我想我想知道这是否正确,或者是否有更好的方法来实现它而不是公开成为 问题答案: 是的,Java枚举可以具有功能。 http://docs.o

  • 问题内容: 在执行以下操作时,当我尝试访问延迟加载的异常时遇到错误: 我的实体看起来像这样: 我的印象是,通过在我的方法中使用@Transactional批注,它将使会话保持活动状态,直到该方法完成为止,从而使我可以访问延迟加载的Address集合。 我想念什么吗? 编辑 按照Tomasz的建议:在我的方法中,状态变为。 这确实可以缩小问题的范围,但是为什么此时我的“交易”不能处于活动状态? 问题

  • 本文向大家介绍C#中的StringBuilder.EnsureCapacity()方法,包括了C#中的StringBuilder.EnsureCapacity()方法的使用技巧和注意事项,需要的朋友参考一下 C#中的StringBuilder.EnsureCapacity()方法用于确保StringBuilder实例的容量至少为指定值。 语法 语法如下- 以上,参数容量是要确保的最小容量。 示例