我有一个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)它们正在等待的线程是可运行的
"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锁。
VM作为一个服务运行,所以它不应该尝试做AWT之类的事情,但它是由我正在使用的库完成的。
有什么想法吗?我能防止这种情况发生吗?
谢谢!
发布于 2015-07-15 20:37:48
有没有可能你的应用程序调用了push(EventQueue newEventQueue)并推送了相同的eventQueue?如果是,那么this和它的nextQueue将是相同的对象,它们将在一个死循环中运行,消耗CPU到100%。
从堆栈跟踪可以明显看出,至少有一个线程正在运行。所以这不是死锁的问题。
从100% CPU消耗提示和它的状态为RUNNABLE,很明显它正在进行无限循环。
当且仅当nextQueue的值已经在链中(或this)时,代码才会进入无限循环。这很可能是一个应用程序问题。谢谢。
发布于 2015-07-11 20:12:17
您的问题是死锁问题(see wikipeida)。

正如您在上面看到的,您的两个EventQueues (这里是R1和R2)处于死锁状态-它们中的每个都声明了一个资源,并且不能继续运行,而另一个确实声明了另一个资源。两个人都在无尽地等待着对方。
您可以使用不同的方法来解决此问题:
尝试更改库,你是对的,如果一个库不是一个与awt密切相关的库,那么它就不应该尝试做awt的东西。在像github这样的平台上有很多库,我很确定你会找到另一个库来替代导致错误的库。
如果您能够编辑您的代码以添加监视,那么您也可以防止任何死锁。
synchronized(lock){
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
lock.notifyAll();
}https://stackoverflow.com/questions/29628482
复制相似问题