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

Java事件调度线程说明

唐弘益
2023-03-14
问题内容

我最近开始学习和探索Java中GUI编程的基础知识。

经过一段时间的编程,我只完成了后端工作或其他工作,因此,我最接近用户界面的是命令控制台(令人尴尬的是,我知道)。

我正在使用Swing,据我所知,通过扩展,我也正在使用AWT。

我的问题基于以下代码:

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new frame.setVisible(true);
    }
} );

我已经研究了一段时间,因为我想完全理解这段奇怪的代码,并且多次遇到“事件分派线程”一词。如果我错了,请纠正我,但据我了解;它与使用多个线程以及Java Swing如何解释这些线程有关。我还收集到上面的代码用于在创建窗口之前确保所有线程都是“安全的”,因此invokeLater吗?

我读过:

“你只能从事件调度线程中调用在框架上运行的方法”

而且只有在某些情况下,你才能从main方法调用在框架上运行的方法。

有人可以向我说明事件调度线程到底是什么吗?

它与多个执行线程有何关系?如何安全地从main方法调用这些线程?同样为什么我们需要这个invokeLater?

我们不仅可以像其他任何对象一样创建窗口吗?

由于我没有掌握这些关系和想法,因此在研究中遇到了一些障碍。

附带说明的是,我希望将自己的知识基于深入的了解,因为我相信这会带来最佳的总体结果,因此也是最好的程序。如果我深入了解某些东西是如何工作的,那么你可以有效地使用技巧和调整,而不仅仅是将它们重新编写回代码中,因此请不要害怕给我一些额外的深入解释并扩大我的知识。

谢谢。


问题答案:

该事件调度线程是由AWT管理一个特殊的线程。基本上,它是一个无限循环运行的线程,用于处理事件。

该java.awt.EventQueue.invokeLater和javax.swing.SwingUtilities.invokeLater方法的方式来提供,这将在事件队列运行代码。编写在多线程环境中安全的UI框架非常困难,因此AWT作者决定仅允许对GUI对象的操作在单个特殊线程上进行。所有事件处理程序都将在此线程上执行,并且修改GUI的所有代码也应在该线程上运行。

现在,AWT通常不会检查您是否不是从另一个线程发出GUI命令(C#的WPF框架会执行此操作),这意味着可以编写很多代码,并且对此非常了解,并且不会遇到任何问题。但这可能导致不确定的行为,因此,最好的办法是始终确保GUI代码在事件分发线程上运行。invokeLater提供了执行此操作的机制。

一个经典的例子是您需要运行长时间运行的操作,例如下载文件。因此,您启动了一个线程来执行此操作,然后在完成后使用它invokeLater来更新UI。如果不使用invokeLater,而是直接更新了UI,则可能会出现竞争状况,并且可能发生未定义的行为。



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

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

  • 主要内容:1 Java 线程调度程序,2 抢占式调度与时间片调度的区别1 Java 线程调度程序 Java中的线程调度程序是JVM(Java虚拟机)的一部分,它决定应该运行哪个线程。 我们无法保证线程调度程序将会选择哪个线程来运行。 一次只能在一个进程中运行一个线程。线程调度程序主要使用抢占式或时间片调度来调度线程。 2 抢占式调度与时间片调度的区别 在抢占式调度下,最高优先级的任务会一直执行,直到进入等待状态或死机状态或存在更高优先级的任务为止。 在时间分片调度下

  • 我有一个MainClass,一个Worker类和一个Supervisor类。在MainClass中,我创建了10个Worker类和一个Supervisor类,它们在不同的线程中运行。 . . 我不知道如何实现这个,因为每个线程中的条件是相互独立的,所以我不需要同步,所以我不能使用等待通知。

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

  • 我已经知道事件调度线程是如何工作的。如果事件调度线程中有短事件和长事件,应用程序就不能响应。 为了在 Swing 中实现响应,事件调度线程应仅用于短事件。而长事件应该在SwingWorkers上执行。 想象一下有很多短赛事。 那么,有没有什么解决方案可以将一个事件排到事件调度线程的开头呢?