gpt4 book ai didi

java - 什么是事件派发线程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:44:12 32 4
gpt4 key购买 nike

我知道“线程”是什么意思,如果我将事件分派(dispatch)线程 (EDT) 理解为“只是一个线程”,它解释了很多,但显然,它并没有解释一切。

我不明白这个线程有什么特别之处。例如我不明白为什么我们应该在 EDT 中启动一个 GUI?为什么“主”线程是 GUI 的床?好吧,如果我们只是不想占用主线程,为什么我们不能只在“另一个线程”中启动 GUI 为什么它应该是一些称为 EDT 的“特殊”线程?

然后我不明白为什么我们不能像任何其他线程一样启动 EDT?为什么我们应该使用一些特殊工具(称为 invokeLater)。以及为什么 GUI 与其他线程不同,它不会立即启动。我们应该等到它准备好接受我们的工作。是因为 EDT 可以同时执行多个任务吗?

如果您决定回答这个问题,请您使用非常简单的术语,否则恐怕我无法理解答案。

已添加:

我一直认为我们每个线程都有一个“任务”。因此,在每个线程中,我们都执行预定义的命令序列。但在我看来,在事件调度线程中我们可以有服务器任务。好吧,它们不是同时执行的(线程在不同任务之间切换,但一个线程中仍然有多个任务)。这样对吗?例如,在 EDT 中有一个线程显示主窗口,除此之外我们还向 EDT 发送了另一个任务,该任务应该更新一个窗口组件,EDT 将在准备就绪时执行这个新任务。 EDT 在这方面与其他线程不同吗?

最佳答案

事件调度线程是处理所有 GUI 事件和管理 Swing GUI 的线程。如果您的程序中有任何 GUI,它会在 Swing 代码的某处启动。它在幕后完成的原因是简单 - 您不必费心自己启动和管理额外的线程。

关于您必须使用 invokeLater() 更新 GUI 这一事实,这是因为并发问题。 GUI 只能从一个线程进行修改,因为 Swing 不是线程安全的(值得注意的是,大多数 工具包都不是线程安全的,nice article 给出了一些原因)。这就是为什么您必须提交所有 GUI 更新才能在 EDT 上运行。

您可以在 Sun tutorial on concurrency in Swing 中阅读更多关于 Swing 中的并发性和事件分派(dispatch)线程的信息.此外,如果您想了解如何以不同的方式完成此操作,您可能想查看 SWT toolkit。 .在 SWT 中,您必须自己管理 EDT。

关于java - 什么是事件派发线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484615/

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