Причина в том, что когда вы вызываете setVisible (true) в JFrame, за кулисами запускается поток, не являющийся демоном, и JVM не завершает работу до тех пор, пока не завершатся все потоки, не являющиеся демонами.
Пожалуйста, ознакомьтесь здесь с более подробной информацией по AWT / Swing Threading .
В нем говорится:
"Существует хотя бы один живой поток, не являющийся демоном, в то время как в приложении имеется хотя бы один отображаемый компонент AWT или Swing (см. Component.isDisplayable )."
Хотя это для Java 1.5, я думаю, что это все еще действительная информация.
Кроме того, я считаю, что поток диспетчеризации событий или EDT не является потоком демона, и поэтому это другой поток, связанный с Swing, который управляет этим.
Редактировать 1
Это говорит о том, что EDT на самом деле не является потоком Daemon:
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class IsEdtDaemon {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
System.out.printf("Is the current thread the EDT thread: %b%n", SwingUtilities.isEventDispatchThread());
System.out.printf("Is our EDT Thread a daemon thread: %b%n", Thread.currentThread().isDaemon());
}
});
}
}
Вывод из кода:
Является ли текущий поток потоком EDT: true
Является ли наша тема EDT потоком демона: false