gpt4 book ai didi

java - AWT-EventQueue 未从 Unsafe.park 唤醒

转载 作者:行者123 更新时间:2023-11-30 11:07:40 26 4
gpt4 key购买 nike

我们创建了一个使用多个 AppContext 运行的应用程序。现在,当一个 AppContext 被处理掉时,突然间剩下的 AWT-EventQueue 不再被 Swing Events 唤醒。

所以当我启动应用程序并且只有一个 EventQueue 时,线程转储如下所示:

"AWT-EventQueue-0" prio=5 tid=0x00007fe976a49800 nid=0xf003 waiting on condition [0x000000011ca5d000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007c2644870> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.awt.EventQueue.getNextEvent(EventQueue.java:543)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

这个 EventQueue 就好了。我唤醒用户事件并重新呈现 GUI。现在,在创建和处理不同的 AppContext 之后,线程转储如下所示:

"AWT-EventQueue-0" prio=5 tid=0x00007fe976a49800 nid=0xf003 waiting on condition [0x000000011ca5d000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000740f41b80> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.awt.EventQueue.getNextEvent(EventQueue.java:543)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

如您所见,它是相同的线程转储(ConditionObject 除外),但 GUI 变得无响应,因为 EventQueue 没有从 GUI 事件的 park 方法中唤醒。该机制如何运作?谁负责创建 Swing 事件和唤醒 EventQueue? Eclipse 仅显示一个其他线程 (DestroyJavaVM)。

我卡住了。我不知道去哪里看。将不胜感激关于调查方向的任何提示。

最佳答案

我不知道你真正的问题(如果 AppContext 你指的是 sun.awt.AppContext,那么你真的不应该使用 sun 包......),但我可以回答你的问题。

How does that mechanism even work? Who is responsible for creating the Swing Events and waking the EventQueue? Eclipse shows only one other thread (DestroyJavaVM).

每个 Java 应用程序中都有很多线程。即使在“hello world”应用程序中也有许多线程(“Finalizer”、“Monitor Ctrl-Break”等),并且在每个 swing 应用程序中都有几个额外的线程(EDT、“Java2D Disposer”、“AWT-Windows”等) .). “AWT-Windows”是从操作系统(至少在 Windows 上)轮询事件并“唤醒”EDT 的线程。看到这个:What is AWT-Windows thread?

另见:Get a List of all Threads currently running in Java

关于java - AWT-EventQueue 未从 Unsafe.park 唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28828155/

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