2010-07-19 1 views

ответ

6

Вы не должны звонить System.exit(), если вы можете помочь.

Лучший способ выхода из процесса java - обеспечить нормальное выполнение всех потоков. Это прекратит работу виртуальной машины.

В начало JFrame, вы должны setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE).

Затем вы можете позвонить по телефону frame.dispose(), чтобы закрыть JFrame и выйти из EDT.

+3

не должно быть 'DISPOSE_ON_EXIT'? Использование 'EXIT_ON_CLOSE' также приведет к уничтожению запущенных потоков, не позволяя им нормально выйти (когда пользователь закрывает JFrame). –

+2

Я не согласен. GC займет некоторое время, прежде чем все округляется, и приложение выйдет. Нет ничего плохого в вызове System.exit, когда вы имеете дело с закрытием того, что вы должны. Файлы, сокеты и такие близкие просто находят самостоятельно после вызова System.exit. – Mike

5

Поскольку виртуальная машина завершается после вызова System.exit(), я не думаю, что она имеет какое-то значение, из которой выполняется нить.

+0

Согласен. Поскольку exit() убивает все на своем пути, вам не стоит беспокоиться о том, какой поток вызывает его. – f1sh

1

System.exit() завершает работу не с потоками, а с самой виртуальной машиной. Поэтому он может быть вызван из любого потока, результат всегда один и тот же, и если VM умрет, все возможные несоответствующие состояния в потоках будут отсутствовать сразу.

3

Вы можете назвать это из любой темы, но это грубо, чтобы использовать его ИМХО. Виртуальная машина будет завершена, независимо от того, что еще работает.

Я предпочитаю dispose() или просто закрываю (с setDefaultCloseOperation(DISPOSE_ON_CLOSE)) любое отображаемое окно (JFrame, JDialog, ...). Если выполняются только потоки демона, виртуальная машина будет прервана. Если есть какой-то живой поток без демона, JVM не завершится, и поток может завершить свою работу.
Выполнение этой задачи, я всегда могу включить (часть) одну программу в другую, не беспокоясь о том, что один из них случайно прекратит действие другой.

Есть очень мало ситуация, когда виртуальная машина действительно нужно «убить» ...

0

Есть правила Качели нить EDT прекратить нормально.

Главное, чтобы все рамы были расположены. К сожалению, это может быть не так просто, если вы используете модальные диалоги без родителей, потому что Swing создаст невидимый родительский фрейм для таких диалогов.

В этом случае вам необходимо указать все кадры (для этого вы можете использовать Frame.getFrames()) и явно dispose().

Конечно, вы должны убедиться, что нет Thread (кроме демонов). Некоторые библиотеки и даже некоторые API от JDK создают потоки не-демона, которые вы должны отключить самостоятельно.

Наконец, и самое главное, не вызывать System.exit() не будет работать в среде Java Web Start (см. this SO question, чтобы найти дополнительную информацию).

Итак, в заключение, мой совет состоял бы в том, чтобы на самом деле позвонить System.exit(), потому что вы не всегда знаете, в какой среде будет запущено ваше приложение. Но я хотел бы добавить важный момент: убедитесь, что у вас есть одна точка, из которой выполняется выход. Вызов от любой темы будет в порядке.

1

Нет ничего плохого в вызове System.exit из любого потока, который вы хотите.Если вы выходите из «нормально», это не работает на практике, потому что вы обнаружите, что приложение будет висит вокруг, пока GC собирает материал, прежде чем приложение завершит работу. Я написал тонны приложений Gui Swing, и нет ничего плохого в том, чтобы позвонить ему. Это тоже не «грубо». Это способ Java.

Смежные вопросы