Может ли быть более одной очереди событий AWT? - PullRequest
7 голосов
/ 20 марта 2009

У меня есть дамп потока апплета, работающего на JVM 1.6.0_12 в Opera 9.64 Build 10487 - и он показывает три очереди событий! Насколько я знаю, обработка событий Java Swing является однопоточной - изменилось ли это в каком-либо недавнем обновлении?

Моя проблема заключается в том, что множественные очереди событий будут вызывать взаимные блокировки, поскольку у меня есть еще несколько блокировок, чем только TreeLock с GUI.

Ответы [ 4 ]

8 голосов
/ 20 марта 2009

Может быть более одного, и это зависит от браузера. Документация EventQueue говорит:

Некоторые браузеры разделяют апплеты в разных кодовых базах на отдельные контексты и устанавливают стены между этими контекстами. В таком сценарии будет один EventQueue на контекст. Другие браузеры помещают все апплеты в один и тот же контекст, подразумевая, что для всех апплетов будет только один глобальный EventQueue. Это поведение зависит от реализации.

4 голосов
/ 20 марта 2009

Да. Как правило, будет * один Toolkit для Toolkit.getDefaultToolkit, но несколько EventQueue с Toolkit.getSystemEventQueue (что из 1.2.2 вы обычно получаете разрешения для успешного вызова). В стеке есть магия, основанная на ThreadGroup и ClassLoader s, чтобы определить, какой EventQueue вернуть.

Апплеты разделены в зависимости от их происхождения и конфигурации. Как именно это делается, зависит от реализации.

Теперь, вероятно, вы видите очередь событий для вашего апплета и безопасный контекст. Защищенный контекст обрабатывает диалоговые окна самого плагина. Принимаем сертификаты и тому подобное. Безопасный контекст защищает их от кода пользователя в контексте вашего апплета.

2 голосов
/ 07 мая 2010

"Swing создает новый EventQueue (и поток IIRC), когда вы показываете модальное диалоговое окно" На самом деле это неправильно. Я обсуждал это некоторое время назад с парнем Swing, и Swing только добавляет новый фильтр в существующую очередь событий, чтобы отфильтровать события, поступающие из другого источника (окна / компонента). Поэтому для модального диалога не создается новый поток / эквалайзер. Вы можете убедиться в этом, открыв модальное диалоговое окно и получив дамп потока до и после открытия модального диалогового окна, и сравните стек вызовов потока AWT. По крайней мере, так оно и есть со стандартным Java-приложением. Я еще не проверял апплет.

2 голосов
/ 25 марта 2009

Кроме того, Swing создает новый EventQueue (и поток IIRC), когда вы показываете модальное диалоговое окно, эта очередь событий активна (предыдущая находится в режиме ожидания), пока модальное диалоговое окно не будет закрыто.

Однако я не уверен, что происходит при наличии нескольких уровней модальных диалогов (1 основная очередь + 1 очередь на диалог или 1 основная очередь + 1 очередь для всех диалогов).

...