Вызов System.exit()
в хуке выключения бессмысленен. JVM уже решила завершить работу до того, как будет вызван хук. Я полагаю, что вызов System.exit()
из ловушки отключения может быть проблематичным...
Предположительно, причина того, что ваше приложение не закрывается, заключается в том, что ваше приложение создало другие потоки, и они все еще живы.
Один из способов справиться с этим - заставить событие закрытия JFrame (или кнопку закрытия) запускать что-то, что запускает завершение работы JVM. Ваш код f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
— один из способов сделать это. Он вызовет System.exit ... и ЭТО запустит любые перехватчики выключения, когда JVM выключится.
Другой способ — пометить другие потоки как потоки «демона», что означает, что они не помешают JVM принять решение о завершении работы. (Обычно JVM отключается, если нет живых потоков, отличных от демона. Для однопоточного приложения это означает ваш «основной» поток...)
Интересно, вот почему вызов System.exit() проблематичен в перехватчике выключения.
В javadoc говорится, что System.exit()
эквивалентно System.getRuntime().exit()
, а в javadoc для последнего сказано следующее:
"Если этот метод вызывается после того, как виртуальная машина начала свою последовательность завершения работы, то, если запущены перехватчики выключения, этот метод будет заблокирован на неопределенный срок."
Таким образом, если вы вызываете System.exit()
внутри хука выключения, этого достаточно, чтобы хук заблокировался на неопределенный срок. И это приведет к остановке последовательности выключения.
person
Stephen C
schedule
02.02.2013