Tôi có một chương trình Java lấy CPU 100%, nhưng dường như không làm gì cả.Vòng lặp vô hạn trong EventQueue.isDispatchThread()
Nếu tôi lấy một bãi chứa chuỗi, có 4 chủ đề (trong số 5 hồ bơi) đang đợi để khóa.
"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)
Các chủ đề họ đang chờ đợi là 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)
Đây là JDK 7.0.25, vì vậy có vẻ như một thread đang bị mắc kẹt trên
EventQueue next = eq.nextQueue;
while (next != null) {
eq = next;
next = eq.nextQueue;
}
Có hai luồng AWT EventQueue , cố gắng để có được cùng một pushpoplock.
Máy ảo hoạt động như một dịch vụ, do đó, nó không nên cố gắng thực hiện công việc AWT, nhưng nó được thực hiện bởi một thư viện mà tôi đang sử dụng.
Bất kỳ ý tưởng nào? Tôi có thể ngăn điều này xảy ra không?
Cảm ơn!
1. bạn có nghe nói về SecondaryLoop, 2. nhưng "lấy 100% cpu, nhưng dường như không làm gì cả." nói về JProfiler, 3. không có SSCCE/MCVE isn 'answerable, 4. 'java.awt.EventQueue.isDispatchThreadImpl (EventQueue.java: 1019) nói về isEventDispatchThread trả về false', hoặc các sự kiện được thực hiện trong EDT không có doanh nghiệp ở đó 5. không có ý tưởng, không có sự kiện từ EDT hiện tại hoặc ngoại lệ từ RepaintManager – mKorbel
1) Tôi chưa từng nghe về SecondaryLoop trước đây. Tôi đã nhìn nó lên nhưng bản thân tôi không sử dụng AWT, đó là một thư viện tôi sử dụng mà gọi phương thức. 2) Tôi đã không sử dụng JProfiler, tôi đã sử dụng JVisualVM, nó cung cấp cho tôi với threaddump tôi đã hiển thị các đoạn của. 3) Tôi không thể tái tạo nó thật không may. Đó là một vấn đề tôi có trong sản xuất, tất cả những gì tôi có là kết xuất chuỗi, vì vậy tôi không thể cung cấp SSCCE. 4-5) Tôi sợ tôi không hiểu những điều này. –
Ai đang đặt eq.nextQueue thành null? Nếu không có ai thiết lập nó thì vòng lặp sẽ chạy vô hạn và CPU 100% là có thể. Nếu có và nếu nó được thực hiện bởi một số chủ đề khác thì sq.nextQueue nên dễ bay hơi. Nếu không thread này có thể không chọn giá trị kể từ khi thread có thể được cache giá trị của eq.nextQueue nơi vòng lặp sẽ chạy vô hạn một lần nữa và CPU 100% có thể. – Eranda