Mam program Java, biorąc 100% procesora, ale pozornie nic nie robi.Nieskończona pętla w EventQueue.isDispatchThread()
Jeśli wykonam zrzut wątku, czekają na niego 4 wątki (z puli 5).
"Incoming WorkPool 5" - Thread [email protected]
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" [email protected]
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)
Gwint czekają na to Runnable
"Incoming WorkPool 3" - Thread [email protected]
java.lang.Thread.State: RUNNABLE
at java.awt.EventQueue.isDispatchThreadImpl(EventQueue.java:1024)
at java.awt.EventQueue.isDispatchThread(EventQueue.java:1014)
To JDK 7.0.25, więc wydaje się jeden wątek jest zablokowany na
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
Istnieją dwa wątki AWT EventQueue , próbując zdobyć tę samą pushpoplock.
Maszyna wirtualna działa jako usługa, więc nie powinna próbować wykonywać zadań AWT, ale jest to wykonywane przez bibliotekę, z której korzystam.
Wszelkie pomysły? Czy mogę temu zapobiec?
Dzięki!
1. Czy słyszałeś o SecondaryLoop, 2. ale "biorąc 100% procesora, ale najwyraźniej nic nie robiąc". mówiąc o JProfiler, 3. bez SSCCE/MCVE nie odpowiada, 4. 'java.awt.EventQueue.isDispatchThreadImpl (EventQueue.java: 1019) mówienie o isEventDispatchThread zwraca false' lub zdarzenia wykonane w EDT nie mają tam żadnego biznesu. 5. nie mam pojęcia, bez zdarzeń z bieżącego EDT lub wyjątku od RepaintManager – mKorbel
1) Nie słyszałem wcześniej o SecondaryLoop. Sprawdziłem to, ale ja sam nie używam AWT, jest to biblioteka, która używa tej metody. 2) Nie użyłem JProfiler, użyłem JVisualVM, dostarczyłem mi wątek, który pokazałem fragmenty. 3) Nie mogę tego niestety odtworzyć. To był problem, który miałem w produkcji, wszystko, co mam, to zrzut wątku, więc nie mogę zapewnić SSCCE. 4-5) Obawiam się, że ich nie rozumiem. –
Kto ustawia wartość eq.nextQueue na wartość null? Jeśli nikt go nie ustawi, pętla uruchomi się w nieskończoność, a CPU 100% będzie możliwe. Jeśli tak i jeśli zrobi to jakiś inny wątek, to sq.nextQueue powinno być niestabilne. Jeśli nie, ten wątek może nie wybrać wartości, ponieważ wątek może być buforowany wartością eq.nextQueue, w której pętla uruchomi się w nieskończoność, a procesor będzie w 100% możliwy. – Eranda