Программа принудительного закрытия Java

Как я могу программно принудительно закрыть программу при выходе. Я добавил хук выключения, который вызывает System.exit(0), но, похоже, у него проблемы с его выполнением. Процесс javaw.exe продолжает работать в памяти, несмотря на то, что Jframe закрыт и хук выключения выполнен.

Кроме того, когда я вручную закрываю пакетный файл, в котором запущена программа, Windows выдает сообщение Force Close. изображение: http://i.imgur.com/gy57OEV.png


person Chris    schedule 02.02.2013    source источник
comment
добавьте свое исключение, используя stacktrace   -  person Mohammod Hossain    schedule 02.02.2013
comment
Кажется, нет никаких исключений... Он просто не закрывается. Также, когда я вручную закрываю пакетный файл, Windows выдает сообщение Force Close.   -  person Chris    schedule 02.02.2013


Ответы (2)


Вызов 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
comment
Ну, я добавил что-то вроде f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);, которое, как я полагаю, вызовет хук выключения. Но что мне нужно в хуке выключения, чтобы фактически закрыть процесс? В том виде, в котором он есть сейчас, он просто дает сообщение о закрытии сил. - person Chris; 02.02.2013
comment
Ooooohhh Хорошо, я понимаю, что вы говорите, понял. Я удалил System.exit(0); из хука выключения, и теперь он закрывается правильно. Спасибо за помощь - person Chris; 02.02.2013

System.exit() корректно работает в JOptionPane сценариях:

Object[] options={"YES","NO"};
int selection= JOptionPane.showOptionDialog(this, "Message input", "Title",
        JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, 
        options[1]);
if(selection==JOptionPane.YES_OPTION){
    reset();
}
else if(selection==JOptionPane.NO_OPTION){
    System.exit(0);
}

но, как указано выше, f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); все еще присутствует в моем основном методе

person Daniel Adams    schedule 21.04.2014