EventQueue.isDispatchThread()中的无限循环

时间:2015-04-14 13:21:37

标签: 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。

虚拟机作为服务运行,所以它不应该尝试做AWT的东西,但它是由我正在使用的库完成的。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

Deadlock situation here 正如您在上面所看到的,您的两个EventQueues(此处为R1和R2)处于死锁状态 - 每个都声明了一个资源,并且无法继续运行 另一个人确实要求另一个资源。两人都在等待着彼此无穷无尽。

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

尝试更改库,你是对的,图书馆不应该尝试做awt 如果它不是一个与awt密切相关的库。 像github这样的平台上有很多库,我很确定你找到了 另一个库来替换导致错误的库。

如果您能够编辑代码以添加监控 防止任何死锁。

synchronized(lock){
EventQueue next = eq.nextQueue;
while (next != null) {
    eq = next;
    next = eq.nextQueue;
}
lock.notifyAll();
}
相关问题