В Swing-приложении это нормально вызывать System.exit()
из любой темы? (например, на EDT?)Из какого потока следует вызывать System.exit() в Swing-приложении?
ответ
Вы не должны звонить System.exit()
, если вы можете помочь.
Лучший способ выхода из процесса java - обеспечить нормальное выполнение всех потоков. Это прекратит работу виртуальной машины.
В начало JFrame
, вы должны setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
.
Затем вы можете позвонить по телефону frame.dispose()
, чтобы закрыть JFrame
и выйти из EDT.
Поскольку виртуальная машина завершается после вызова System.exit()
, я не думаю, что она имеет какое-то значение, из которой выполняется нить.
Согласен. Поскольку exit() убивает все на своем пути, вам не стоит беспокоиться о том, какой поток вызывает его. – f1sh
System.exit()
завершает работу не с потоками, а с самой виртуальной машиной. Поэтому он может быть вызван из любого потока, результат всегда один и тот же, и если VM умрет, все возможные несоответствующие состояния в потоках будут отсутствовать сразу.
Вы можете назвать это из любой темы, но это грубо, чтобы использовать его ИМХО. Виртуальная машина будет завершена, независимо от того, что еще работает.
Я предпочитаю dispose()
или просто закрываю (с setDefaultCloseOperation(DISPOSE_ON_CLOSE)
) любое отображаемое окно (JFrame, JDialog, ...). Если выполняются только потоки демона, виртуальная машина будет прервана. Если есть какой-то живой поток без демона, JVM не завершится, и поток может завершить свою работу.
Выполнение этой задачи, я всегда могу включить (часть) одну программу в другую, не беспокоясь о том, что один из них случайно прекратит действие другой.
Есть очень мало ситуация, когда виртуальная машина действительно нужно «убить» ...
Есть правила Качели нить EDT прекратить нормально.
Главное, чтобы все рамы были расположены. К сожалению, это может быть не так просто, если вы используете модальные диалоги без родителей, потому что Swing создаст невидимый родительский фрейм для таких диалогов.
В этом случае вам необходимо указать все кадры (для этого вы можете использовать Frame.getFrames()
) и явно dispose()
.
Конечно, вы должны убедиться, что нет Thread
(кроме демонов). Некоторые библиотеки и даже некоторые API от JDK создают потоки не-демона, которые вы должны отключить самостоятельно.
Наконец, и самое главное, не вызывать System.exit() не будет работать в среде Java Web Start (см. this SO question, чтобы найти дополнительную информацию).
Итак, в заключение, мой совет состоял бы в том, чтобы на самом деле позвонить System.exit()
, потому что вы не всегда знаете, в какой среде будет запущено ваше приложение. Но я хотел бы добавить важный момент: убедитесь, что у вас есть одна точка, из которой выполняется выход. Вызов от любой темы будет в порядке.
Нет ничего плохого в вызове System.exit из любого потока, который вы хотите.Если вы выходите из «нормально», это не работает на практике, потому что вы обнаружите, что приложение будет висит вокруг, пока GC собирает материал, прежде чем приложение завершит работу. Я написал тонны приложений Gui Swing, и нет ничего плохого в том, чтобы позвонить ему. Это тоже не «грубо». Это способ Java.
- 1. UiKit следует вызывать только из основного потока сообщений
- 2. Когда вызывать System.exit() на узле кластера?
- 3. Когда следует называть System.exit в Java
- 4. Должен ли я явно вызывать System.exit() в приложении Webstart?
- 5. Когда следует вызывать SelectFont?
- 6. Как я могу «захватить» System.exit (-1) из другого потока?
- 7. Безопасно ли вызывать CFRunLoopStop из другого потока?
- 8. Какой метод TextFieldDelegate следует вызывать?
- 9. Сообщение об ошибке, что UIKit не следует вызывать из вторичного потока
- 10. Как следует вызывать методы тестирования в PHPUnit
- 11. Изящный способ выхода из dm_job? System.exit()?
- 12. От какого потока dealloc вызывается под ARC?
- 13. log4j2 вызвать System.exit
- 14. Игнорировать System.exit() из другого класса
- 15. Безопасно ли вызывать размер в контейнере std из другого потока?
- 16. System.exit (0) в java
- 17. Когда следует вызывать функцию selectize.js selectize()?
- 18. System.exit() в android
- 19. Следует ли вызывать [super loadView] из loadView или нет?
- 20. Как определить, какие события начала следует вызывать из BPMN callActivity
- 21. System.exit в Java Thread
- 22. System.exit в сервлете
- 23. Безопасно ли вызывать NetworkStream.BeginWrite несколько раз из одного потока?
- 24. Как правильно вызывать функции SQLite из фонового потока на iPhone?
- 25. ArcGIS Explorer: вызывать основной поток из вторичного потока
- 26. Как вызывать оператор std stream из шаблонного оператора потока?
- 27. Как автоматически вызывать метод для остановки потока?
- 28. JavaFX Popup нужно вызывать из потока javaFX GUI?
- 29. F #, FParsec, и вызывать рекурсивный анализатор потока
- 30. Как захватить событие System.exit?
не должно быть 'DISPOSE_ON_EXIT'? Использование 'EXIT_ON_CLOSE' также приведет к уничтожению запущенных потоков, не позволяя им нормально выйти (когда пользователь закрывает JFrame). –
Я не согласен. GC займет некоторое время, прежде чем все округляется, и приложение выйдет. Нет ничего плохого в вызове System.exit, когда вы имеете дело с закрытием того, что вы должны. Файлы, сокеты и такие близкие просто находят самостоятельно после вызова System.exit. – Mike