首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EventQueue.isDispatchThread()中的无限循环

EventQueue.isDispatchThread()中的无限循环
EN

Stack Overflow用户
提问于 2015-04-14 21:21:37
回答 2查看 964关注 0票数 15

我有一个Java程序占用了100%的cpu,但似乎什么也没做。

如果我进行线程转储,那么有4个线程(共5个线程)在等待获取锁。

代码语言:javascript
复制
"Incoming WorkPool 5" - Thread t@363
   java.lang.Thread.State: WAITING
    at sun.misc.Unsafe.park(Native Method)
    - waiting to lock <7212149b> (a java.util.concurrent.locks.ReentrantLock$NonfairSync) owned by "Incoming WorkPool 3" t@354
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
    at java.awt.EventQueue.isDispatchThreadImpl(EventQueue.java:1019)
    at java.awt.EventQueue.isDispatchThread(EventQueue.java:1014)

它们正在等待的线程是可运行的

代码语言:javascript
复制
"Incoming WorkPool 3" - Thread t@354
   java.lang.Thread.State: RUNNABLE
    at java.awt.EventQueue.isDispatchThreadImpl(EventQueue.java:1024)
    at java.awt.EventQueue.isDispatchThread(EventQueue.java:1014)

这是JDK 7.0.25,所以似乎有一个线程被卡住了

代码语言:javascript
复制
EventQueue next = eq.nextQueue;
while (next != null) {
    eq = next;
    next = eq.nextQueue;
}

有两个AWT锁线程,试图获取相同的EventQueue锁。

VM作为一个服务运行,所以它不应该尝试做AWT之类的事情,但它是由我正在使用的库完成的。

有什么想法吗?我能防止这种情况发生吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-07-15 20:37:48

有没有可能你的应用程序调用了push(EventQueue newEventQueue)并推送了相同的eventQueue?如果是,那么this和它的nextQueue将是相同的对象,它们将在一个死循环中运行,消耗CPU到100%。

从堆栈跟踪可以明显看出,至少有一个线程正在运行。所以这不是死锁的问题。

从100% CPU消耗提示和它的状态为RUNNABLE,很明显它正在进行无限循环。

当且仅当nextQueue的值已经在链中(或this)时,代码才会进入无限循环。这很可能是一个应用程序问题。谢谢。

票数 1
EN

Stack Overflow用户

发布于 2015-07-11 20:12:17

您的问题是死锁问题(see wikipeida)。

正如您在上面看到的,您的两个EventQueues (这里是R1和R2)处于死锁状态-它们中的每个都声明了一个资源,并且不能继续运行,而另一个确实声明了另一个资源。两个人都在无尽地等待着对方。

您可以使用不同的方法来解决此问题:

尝试更改库,你是对的,如果一个库不是一个与awt密切相关的库,那么它就不应该尝试做awt的东西。在像github这样的平台上有很多库,我很确定你会找到另一个库来替代导致错误的库。

如果您能够编辑您的代码以添加监视,那么您也可以防止任何死锁。

代码语言:javascript
复制
synchronized(lock){
EventQueue next = eq.nextQueue;
while (next != null) {
    eq = next;
    next = eq.nextQueue;
}
lock.notifyAll();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29628482

复制
相关文章

相似问题

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