java - tipos - for programacion
Bucle infinito en EventQueue.isDispatchThread() (2)
Tu problema es un problema de punto muerto ( ver wikipeida ).
Como puede ver arriba, sus dos EventQueues (aquí R1 y R2) están en una situación de punto muerto: cada uno de ellos ha reclamado un recurso y no puede seguir avanzando mientras que el otro sí reclamó el otro recurso. Ambos están esperando el uno al otro sin fin.
Puede resolver este problema con diferentes enfoques:
Intenta cambiar la biblioteca, tienes razón en que una biblioteca no debería tratar de hacer otras cosas si no es una biblioteca estrechamente relacionada con awt. Hay muchas bibliotecas en plataformas como github, estoy bastante seguro de que encontrará otra biblioteca para reemplazar la que causa el error.
Si puede editar su código para agregar monitoreo, también evita los bloqueos.
synchronized(lock){
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
lock.notifyAll();
}
Tengo un programa Java que toma 100% de CPU, pero aparentemente no hago nada.
Si tomo un volcado de subprocesos, hay 4 subprocesos (de un grupo de 5) esperando para tomar un bloqueo.
"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)
El hilo que están esperando es 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)
Esto es JDK 7.0.25, por lo que parece que un hilo está atascado
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
Hay dos subprocesos AWT EventQueue, que intentan adquirir el mismo pushpoplock.
La VM se ejecuta como un servicio, por lo que no debería tratar de hacer cosas AWT, pero lo hace una biblioteca que estoy usando.
¿Algunas ideas? ¿Puedo evitar que esto suceda?
¡Gracias!
¿Existe alguna posibilidad de que el programa de aplicación push(EventQueue newEventQueue)
y empuje el mismo eventQueue? En caso afirmativo, entonces, this
y su nextQueue
serán los mismos objetos y se ejecutarán en una CPU que consume bucles sin fin al 100%.
Desde el seguimiento de la pila es evidente que se está ejecutando al menos un hilo. Entonces no es una cuestión de DEADLOCK.
Desde la sugerencia de consumo de CPU al 100% y su estado como RUNNABLE, es evidente que está haciendo un ciclo infinito.
El código puede entrar en un bucle infinito si y solo si el nextQueue
tiene un valor que ya está en la cadena (o this
). Podría ser un problema de aplicación. Gracias.