gpt4 book ai didi

java - Event Dispatch Thread 究竟是什么时候启动的?

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:35 24 4
gpt4 key购买 nike

EDT 究竟是什么时候开始的?哪一行代码负责?

我的猜测是“someSwingComponent.setVisible(true)”可以解决问题,但我不确定。

谢谢!

最佳答案

问:EDT 究竟是什么时候开始的?哪一行代码负责[f]它?

Swing 的内部工作是特定于 JVM 的。不同的 JVM 根据不同的标准启动事件调度线程 (EDT)。一般来说:

The EDT starts when it receives its first AWTEvent.

下面的堆栈跟踪再次证实了这一点。以下面的 main 方法为例。

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setVisible(true);
}

在上面的示例中,负责启动 EDT 的代码行是 frame.setVisible(true);

上面的main 方法是在两个不同的JVM 上执行的。断点位于 EventQueue.initDispatchThread。当遇到断点时,记录了以下堆栈跟踪。

AWT-AppKit 线程上使用 Mac 的 JDK:

EventQueue.initDispatchThread() line: 906   
EventQueue.wakeup(boolean) line: 1109
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
SunToolkit.wakeupEventQueue(EventQueue, boolean) line: 348
PostEventQueue.postEvent(AWTEvent) line: 2137
SunToolkit.postEvent(AppContext, AWTEvent) line: 583
SunToolkit.executeOnEventHandlerThread(PeerEvent) line: 654
SunToolkit.executeOnEventHandlerThread(Object, Runnable) line: 631
EventFactoryProxy.windowMoved(CWindow) line: 89

main 线程上使用 Oracle 的 JDK for Windows:

java.awt.EventQueue.initDispatchThread() line: 861  
java.awt.EventQueue.postEventPrivate(java.awt.AWTEvent) line: 199
java.awt.EventQueue.postEvent(java.awt.AWTEvent) line: 180
javax.swing.RepaintManager.scheduleProcessingRunnable(sun.awt.AppContext) line: 1369
javax.swing.RepaintManager.nativeAddDirtyRegion(sun.awt.AppContext, java.awt.Container, int, int, int, int) line: 548
javax.swing.SwingPaintEventDispatcher.createPaintEvent(java.awt.Component, int, int, int, int) line: 45
sun.awt.windows.WFramePeer(sun.awt.windows.WComponentPeer).postPaintIfNecessary(int, int, int, int) line: 741
sun.awt.windows.WFramePeer(sun.awt.windows.WComponentPeer).handlePaint(int, int, int, int) line: 736
sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget(sun.awt.windows.WComponentPeer) line: 274
sun.java2d.d3d.D3DScreenUpdateManager.createScreenSurface(sun.awt.Win32GraphicsConfig, sun.awt.windows.WComponentPeer, int, boolean) line: 175
...
sun.awt.windows.WToolkit.createFrame(java.awt.Frame) line: 383
javax.swing.JFrame(java.awt.Frame).addNotify() line: 460
javax.swing.JFrame(java.awt.Window).show() line: 859
javax.swing.JFrame(java.awt.Component).show(boolean) line: 1584
javax.swing.JFrame(java.awt.Component).setVisible(boolean) line: 1536
javax.swing.JFrame(java.awt.Window).setVisible(boolean) line: 842
Example.main(java.lang.String[]) line: 113

在 Mac 上,调用 PostEventQueue.postEvent(AWTEvent)。同样在 Windows 上,调用 java.awt.EventQueue.postEvent(java.awt.AWTEvent)。两者最终都会调用 EventQueue.initDispatchThread


作为另一个例子,考虑下面的 main 方法:

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println("Start!");
}
});
}

main 线程上使用 Mac 的 JDK:

EventQueue.initDispatchThread() line: 906 [local variables unavailable] 
EventQueue.postEventPrivate(AWTEvent) line: 227
EventQueue.postEvent(AWTEvent) line: 208
EventQueue.invokeLater(Runnable) line: 1048
SwingUtilities.invokeLater(Runnable) line: 1267
Example.main(String[]) line: 31

main 线程上使用 Oracle 的 JDK for Windows:

java.awt.EventQueue.initDispatchThread() line: 861  
java.awt.EventQueue.postEventPrivate(java.awt.AWTEvent) line: 199
java.awt.EventQueue.postEvent(java.awt.AWTEvent) line: 180
java.awt.EventQueue.invokeLater(java.lang.Runnable) line: 999
javax.swing.SwingUtilities.invokeLater(java.lang.Runnable) line: 1267

调用 SwingUtilties.invokeLater 负责启动 EDT。这里再次调用 EventQueue.postEvent(AWTEvent)


关于“我的猜测是“someSwingComponent.setVisible(true)”可以解决问题,但我不确定。”的想法

不仅仅是对 someSwingComponent.setVisible(true) 的任何调用都会启动 EDT。例如,执行以下 main 方法不会创建 AWT-Event-Queue-0 线程:

public static void main(String[] args) {
JLabel label = new JLabel();
label.setVisible(true);
}

资源

当然,网上有很多关于 EDT 的资源。

关于java - Event Dispatch Thread 究竟是什么时候启动的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10769895/

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