java - EventQueue.isDispatchThread() 中的无限循环

标签 java multithreading swing awt event-dispatch-thread

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

如果我进行线程转储,则有 4 个线程(在 5 个线程池中)等待获取锁。

"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)

他们正在等待的线程是RUNNABLE

"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,所以似乎有一个线程卡住了

EventQueue next = eq.nextQueue;
while (next != null) {
    eq = next;
    next = eq.nextQueue;
}

有两个 AWT EventQueue 线程,试图获取同一个 pushpoplock。

VM 作为服务运行,因此它不应尝试执行 AWT 操作,但它是由我正在使用的库完成的。

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

谢谢!

最佳答案

是否有可能 push(EventQueue newEventQueue) 被您的应用程序调用并推送相同的 eventQueue?如果是,那么 this 和它的 nextQueue 将是相同的对象,它们将在无限循环中运行,CPU 消耗率达到 100%。

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

从 100% CPU 消耗提示及其状态为 RUNNABLE 来看,很明显它在进行无限循环。

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

关于java - EventQueue.isDispatchThread() 中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29628482/

相关文章:

c# - 进程无法访问文件异常

java从其他类添加jpanels

java - 在 mule 中将线性 json 转换为嵌套 json

java - 为什么在将 Throwable 向下转换为 Exception 时没有给出未经检查的转换警告?

java - 如何在 Java 程序中获取 "ribbon"UI 组件,例如在 Office 2007 中?

c - 成功交换上下文后返回函数执行时出现段错误

c++ - Qt并发映射错误c2440

java - Java Swing 中 MouseMotionListener 的适当方法是什么?

java - 与所有者框架异步打开 JDialog 的问题

java - 使用数组以实现灵活性