Bre*_*man 15 java swing multithreading 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)
Run Code Online (Sandbox Code Playgroud)
他们正在等待的线程是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)
Run Code Online (Sandbox Code Playgroud)
这是JDK 7.0.25,所以似乎有一个线程被卡住了
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
Run Code Online (Sandbox Code Playgroud)
有两个AWT EventQueue线程,试图获得相同的pushpoplock.
VM作为服务运行,所以它不应该尝试做AWT的东西,但它是由我正在使用的库完成的.
有任何想法吗?我可以防止这种情况发生吗?
谢谢!
小智 0
你的问题是一个死锁问题(参见维基百科)。
正如您在上面所看到的,您的两个 EventQueue(此处为 R1 和 R2)处于死锁情况 - 它们中的每一个都已声明一个资源并且无法进一步运行,而另一个则声明另一个资源。两人都在无尽的等待着对方。
您可以使用不同的方法解决此问题:
尝试更改库,你是对的,如果库不是与 awt 密切相关的库,则不应尝试执行 awt 的操作。像 github 这样的平台上有很多库,我很确定您找到了另一个库来替换导致错误的库。
如果您能够编辑代码以添加监控,那么您也可以防止任何死锁。
synchronized(lock){
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
lock.notifyAll();
}
Run Code Online (Sandbox Code Playgroud)