我们创建了一个运行多个AppContexts的应用程序。现在,当一个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)。
我被困住了。我不知道在哪里看。任何有关调查方向的提示都将受到高度赞赏。
答案 0 :(得分:1)
我不知道你的真正问题(如果用AppContext你的意思是sun.awt.AppContext,那你就不应该使用sun包......),但我可以回答你的问题。
该机制如何运作?谁负责创建Swing事件并唤醒EventQueue? Eclipse只显示另一个线程(DestroyJavaVM)。
每个Java应用程序中都有很多线程。即使在一个'#hello world&#34;应用程序有许多线程(&#34; Finalizer&#34;,&#34; Monitor Ctrl-Break&#34;等等),并且在每个swing应用程序中都有几个额外的线程(EDT,&#34; Java2D Disposer&#34 ;,&#34; AWT-Windows&#34;等)。 &#34; AWT-视窗&#34;是从OS(至少在Windows上)轮询事件的线程,并且&#34;唤醒&#34;美国东部时间。请参阅:What is AWT-Windows thread?
答案 1 :(得分:0)
原来问题是自制的。我们在JVM中运行不同的客户端应用程序,为每个客户端应用程序生成自定义AppContext。为了防止内存泄漏,在客户端应用程序终止后,我们确保EventDispatchThread没有自定义EventQueue。所以我们将其重置为默认值。我们在那里有一个错误,这样剩下的EventDispatchThread的EventQueue也会被重置,导致上面的错误。