С чего бы это?Обычно, когда вы показываете окно, вы захотите контролировать выход из JVM.И ничто в спецификации JVM не говорит, что JVM должна завершиться, когда метод main()
достигнет конца.
Oracle имеет некоторую документацию по этой конкретной проблеме :
Причина в том, что AWT инкапсулирует механизм асинхронной отправки событий для обработки событий, которые могут запускать компоненты AWT или Swing.Точное поведение этого механизма зависит от реализации.В частности, он может запускать вспомогательные потоки, не являющиеся демонами, для своих внутренних целей.Фактически, это потоки, которые препятствуют выходу из вышеприведенного примера.
Одно (из трех) ограничений этого механизма таково:
Существует по крайней мере одинживой поток, не являющийся демоном, когда в приложении имеется хотя бы один отображаемый компонент AWT или Swing (см. Component.isDisplayable
).
Это означает, что JVM не будет завершать работусвой собственный, пока есть отображаемый компонент AWT / Swing.
Предупреждение: удаление всех отображаемых компонентов не обязательно означает, что поток, не являющийся демоном, пропал:
Это зависит от реализации, если и когда потоки, не являющиеся вспомогательными, завершаются после того, как все компоненты становятся неотображаемыми.