gpt4 book ai didi

Java Event-Dispatching Thread 解释

转载 作者:IT老高 更新时间:2023-10-28 20:27:18 36 4
gpt4 key购买 nike

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

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

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

我的问题是基于这段代码:

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

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

我已经读到了:

"You can only call methods that operate on the frame from the Event-Dispatching Thread"

并且只有在某些情况下,您才能从 main 方法调用对框架进行操作的方法。

有人可以向我解释一下 Event-Dispatching Thread 到底是什么吗?

它与多个执行线程有何关系,以及从 main 方法调用这些线程是如何不安全的?还有为什么我们需要这个 invokeLater?

我们不能像其他对象一样创建窗口吗?

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

附带说明,我喜欢将我的知识建立在深入理解的基础上,因为我相信这会带来最佳的整体结果,从而产生最好的计划。如果我深入了解某件事的工作原理,那么您可以有效地使用这些技巧和调整,而不是仅仅将它们鹦鹉学舌地复制到代码中,所以请不要害怕给我一些更深入的解释并拓宽我的知识。

谢谢。

最佳答案

event dispatch thread是一个由 AWT 管理的特殊线程。基本上,它是一个无限循环运行的线程,处理事件。

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

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

一个典型的例子是你需要运行一个长时间运行的操作,比如下载一个文件。因此,您启动一​​个线程来执行此操作,然后当它完成时,您使用 invokeLater 来更新 UI。如果您没有使用 invokeLater 而只是直接更新了 UI,您可能会遇到竞争条件并且可能会发生未定义的行为。

Wikipedia has more information

另外,如果您想知道为什么 AWT 作者不只是让工具包成为多线程的,here是一篇好文章。

关于Java Event-Dispatching Thread 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7217013/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com