gpt4 book ai didi

java - SwingUtilities 中的 invokeAndWait 方法

转载 作者:IT老高 更新时间:2023-10-28 21:04:12 28 4
gpt4 key购买 nike

请解释 SwingUtilities 中的 invokeAndWait() 方法。我无法理解这一点。解释的很清楚。 如果你用一个例子来尝试会很有帮助。

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

this 有什么不清楚的地方| ?

这是一个修改后的用法示例:

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]

为什么这很重要?:

Causes doHelloWorld.run() to be executed synchronously on the AWT event dispatching thread. This call blocks until all pending AWT events have been processed and (then) doHelloWorld.run() returns. This method should be used when an application thread needs to update the 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()

关于java - SwingUtilities 中的 invokeAndWait 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5499921/

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