Как остановить Swing EDT - PullRequest
       10

Как остановить Swing EDT

12 голосов
/ 29 января 2011

Типичное приложение Swing запускает EDT в начале, и когда закрывается последнее окно, приложение останавливается в основном с System.exit, неявным или явным.

Но мое небольшое приложение на самом деле является плагином длярамки, которые ничего не знают о Swing.Мой плагин при вызове отображает диалоговое окно, чтобы получить некоторую информацию от пользователя и выйти после нее, но фреймворк будет / должен продолжать работать.Поэтому я не могу позвонить System.exit.

Но если я не сделаю этого, EDT продолжит работать, и как только среда будет завершена, EDT все равно будет работать и работать и запускаться ...

Так что я хотел бы убить EDT, не убивая приложение.Как мне это сделать?

Ответы [ 2 ]

12 голосов
/ 29 января 2011

Следующий документ от Oracle / Sun пролил некоторый свет на эту проблему: Проблемы с AWT Threading

[...]

До версии 1.4 вспомогательные потоки никогда не прерывались.

Начиная с 1.4, поведение изменилось в результате исправления для 4030718. В текущей реализации AWT завершает все свои вспомогательные потоки, позволяя приложению корректно завершать работу, когда выполняются следующие три условия:

  • Нет отображаемых компонентов AWT или Swing.
  • В собственной очереди событий нет собственных событий.
  • В java EventQueues нет событий AWT.

Таким образом, автономное приложение AWT, которое хочет завершить работу без вызова System.exit, должно:

  • Убедитесь, что все компоненты AWT или Swing не отображаются на момент завершения работы приложения. Это можно сделать, вызвав Window.dispose во всех Windows верхнего уровня. Смотрите Frame.getFrames. ...
  • Убедитесь, что ни один метод прослушивателей событий AWT, зарегистрированных приложением с любым компонентом AWT или Swing, не может работать в бесконечном цикле или зависать бесконечно. Например, метод прослушивателя AWT, вызванный некоторым событием AWT, может отправить новое событие AWT того же типа в EventQueue. Аргумент заключается в том, что методы прослушивателей событий AWT обычно выполняются на вспомогательных потоках.

[...]

1 голос
/ 14 ноября 2017

Могут быть некоторые скрытые окна (например, диалоговые окна, отображаемые с использованием JOptionPane.showMessageDialog(…), которые уже закрыты), препятствующие выходу Swing.Вы можете проверить это, используя

Stream.of(Window.getWindows()).forEach(System.out::println);

Если они вам больше не нужны, вы можете легко избавиться от них:

Stream.of(Window.getWindows()).forEach(Window::dispose);

Поток отправки событий должен прекратиться.

...