gpt4 book ai didi

java - Swing 中的 JFrame 窗口是否运行在它们自己的独立线程上?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:40:46 27 4
gpt4 key购买 nike

我有三个密切相关的问题,因为它们相互脱胎而出,代表了一个思路,所以我将它们发布在一个问题下。如果我单独发布它们,将无助于我构建问题的全局。

1) 您能否用简单的语言解释一下 SwingUtilities.invokeLater 的作用?我了解线程,我敢说很多,但文档的语言仍然让我感到困惑。它说:

Causes doRun.run() to be executed asynchronously on the AWT event dispatching thread. This will happen after all pending AWT events have been processed. This method should be used when an application thread needs to update the GUI. In the following example the invokeLater call queues the Runnable object doHelloWorld on the event dispatching thread and then prints a message.

如果我付出一些努力来理解它所说的内容,我认为这就是它所说的内容,但我对此不太确定。我认为它说:

invokeLater 方法仅在应用程序的主线程上安排主窗口的创建及其调度程序/消息泵的设置,而不是在单独的线程上。它通过发布消息来创建窗口并在主/主应用程序线程 上设置它。换句话说,主线程是在对我们说,“你要我创建的窗口将在我完成我现在要做的所有其他事情后创建。”

但是有两件事让我感到困惑,我将其列为下面的两个问题。

2) 那为什么我需要将新窗口的消息循环实现为Runnable。这意味着我想要一个单独的线程来执行该消息循环。

3) 我在创建窗口的函数和作为窗口消息循环的函数中打印出当前线程 ID,它们都是不同的线程。那么,Swing 中的每个窗口都运行在自己的线程上吗?那太疯狂了。你能向我解释一下这里发生了什么吗?另外,能否用一两段解释在 Swing 中创建的 GUI 应用程序的线程模型?

public static void main(String[] args) {
SwingUtilities.invokeLater(new MainWindowEventLoop());
System.out.println(String.format("Main thread %1$d started.",
Thread.currentThread().getId()));
}

public class MainWindowEventLoop implements Runnable {

@Override
public void run() {
JFrame mainWindow = new MainWindow("Main Window");
System.out.println(String.format("Main window loop running on thread %1$d.",
Thread.currentThread().getId()));
}
}

Output:

Main thread 1 started.

Main window loop running on thread 14.

最佳答案

有点复杂,但是Swing不是线程安全的。为了异步和安全地运行 GUI,Sun/Oracle 使用一种称为 Ad-Hoc Thread Confinement 的锁定模式。所有 Swing 组件都必须在 AWT EDT(事件调度线程)上运行,否则结果不是线程安全的。

这是 Oracle 教程的链接。尝试阅读所有这些部分,看看它是否更有意义。

https://docs.oracle.com/javase/tutorial/uiswing/concurrency/

每个窗口都不会在自己独立的线程上运行。只有一个 EDT。每个窗口都在同一个线程 EDT 上运行。当 EDT 有机会执行时,您发送给 EDT 的每个 Runnable 都会按顺序执行,一个接一个。因此 invokeLater() 的“稍后”部分。

关于java - Swing 中的 JFrame 窗口是否运行在它们自己的独立线程上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39156990/

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