2015-03-03 15 views
2

我们创建了一个运行几个AppContext的应用程序。现在,当一个AppContext被处置时,突然间剩下的AWT-EventQueue不会再被唤醒Swing事件。AWT-EventQueue未从Unsafe.park中唤醒

所以,当我启动应用程序,只是有一个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事件中从公园方法中醒来。这个机制如何工作?谁负责创建Swing Events并唤醒EventQueue? Eclipse仅显示另一个线程(DestroyJavaVM)。

我卡住了。我不知道要去哪里看。任何方向调查的任何暗示将受到高度赞赏。

回答

0

原来,问题是自制的。我们在JVM中运行不同的客户端应用程序,为其中的每个应用程序生成一个自定义的AppContext。为了防止内存泄漏,在终止客户端应用程序之后,我们确保EventDispatchThread没有自定义EventQueue。所以我们将它重置为默认值。而且我们在那里发生了错误,因此剩下的EventDispatchThread的EventQueue也会重置,导致上述错误。

1

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

该机制如何工作?谁负责创建Swing Events并唤醒EventQueue? Eclipse仅显示另一个线程(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