首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不从Unsafe.park醒来

不从Unsafe.park醒来
EN

Stack Overflow用户
提问于 2015-03-03 09:24:32
回答 2查看 1.1K关注 0票数 2

我们创建一个使用多个AppContexts运行的应用程序。现在,当一个AppContext被释放时,剩下的突然不再被Swing事件唤醒。

因此,当我启动应用程序并只有一个EventQueue时,线程转储看起来如下所示:

代码语言:javascript
复制
"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之后,线程转储如下所示:

代码语言:javascript
复制
"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)。

我被卡住了。我不知道该去哪找。如有任何关于调查方向的提示,我们将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 12:34:26

原来问题是自己制造的。我们在JVM中运行不同的客户端应用程序,为每个应用程序生成一个自定义AppContext。为了防止内存泄漏,在客户端应用程序终止后,我们确保EventDispatchThread没有自定义EventQueue。所以我们把它重置为缺省值。我们在那里出现了一个错误,因此剩余EventDispatchThread的EventDispatchThread也会被重置,从而导致上面的错误。

票数 0
EN

Stack Overflow用户

发布于 2015-03-03 10:44:56

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

这种机制是如何运作的呢?谁负责创建Swing事件和唤醒EventQueue?Eclipse只显示另一个线程(DestroyJavaVM)。

在每个Java应用程序中都有很多线程。即使在"hello world“应用程序中也有许多线程(”终结器“、”监视器Ctrl中断“等),而且每个swing应用程序都有几个额外的线程(EDT、"Java2D Disposer”、“AWT”等)。“”是从操作系统(至少在Windows上)轮询事件并“唤醒”EDT的线程。参见:What is AWT-Windows thread?

请参见以下内容:Get a List of all Threads currently running in Java

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28828155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档