2015-03-03 4 views
2

Мы создаем приложение, которое работает с несколькими AppContexts. Теперь, когда один AppContext становится доступным, внезапно оставшийся AWT-EventQueue больше не разбуждается в событиях Swing.AWT-EventQueue не пробуждается из Unsafe.park

Так что, когда я запустить приложение и только один EventQueue, свалка нить выглядит следующим образом:

"AWT-EventQueue-0" prio=5 tid=0x00007fe976a49800 nid=0xf003 waiting on condition [0x000000011ca5d000] 
java.lang.Thread.State: WAITING (parking) 
at sun.misc.Unsafe.park(Native Method) 
- parking to wait for <0x00000007c2644870> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) 
at java.awt.EventQueue.getNextEvent(EventQueue.java:543) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

Это EventQueue просто отлично. Я просыпаюсь на пользовательских событиях и переопределяет GUI. Теперь, после создания и удаления другого контекста приложения, свалка нить выглядит следующим образом:

"AWT-EventQueue-0" prio=5 tid=0x00007fe976a49800 nid=0xf003 waiting on condition [0x000000011ca5d000] 
java.lang.Thread.State: WAITING (parking) 
at sun.misc.Unsafe.park(Native Method) 
- parking to wait for <0x0000000740f41b80> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) 
at java.awt.EventQueue.getNextEvent(EventQueue.java:543) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

Как можно видеть, что это тот же самый поток дамп (за ConditionObject исключением), и все же графический интерфейс перестает отвечать на запросы, как Безразлично EventQueue Пробудись из метода парка в событиях GUI. Как работает этот механизм? Кто несет ответственность за создание событий Swing и пробуждение EventQueue? Eclipse показывает только один другой поток (DestroyJavaVM).

Я застрял. Я не знаю, где искать. Любые намеки в каком направлении исследования будут высоко оценены.

ответ

0

Оказывается, проблема была домашняя. Мы запускаем разные клиентские приложения внутри нашей JVM, для каждого из которых мы создаем пользовательский AppContext. Чтобы предотвратить утечку памяти, после завершения клиентского приложения мы гарантируем, что EventDispatchThread не имеет специального события EventQueue. Поэтому мы переустанавливаем его по умолчанию. И у нас там была ошибка, так что EventQueue оставшегося события EventDispatchThread также сбрасывается, что приводит к вышеуказанной ошибке.

1

Я понятия не имею о вашей реальной проблеме (если по AppContext вы имеете в виду sun.awt.AppContext, тогда вы не должны использовать солнечные пакеты ...), но я могу ответить на ваш вопрос.

Как работает этот механизм? Кто несет ответственность за создание событий Swing и пробуждение EventQueue? Eclipse показывает только один другой поток (DestroyJavaVM).

В каждом приложении Java есть много потоков. Даже в приложении «hello world» есть много потоков («Finalizer», «Monitor Ctrl-Break» и т. Д.), И в каждом приложении swing есть несколько дополнительных потоков (EDT, «Java2D Disposer», «AWT-Windows» и т. Д. .). «AWT-Windows» - это поток, который опросает события из ОС (по крайней мере, в Windows) и «пробуждает» EDT. Смотрите это: What is AWT-Windows thread?

см Также в этом: Get a List of all Threads currently running in Java