Из какого потока должен вызываться System.exit () в Swing-приложении? - PullRequest
8 голосов
/ 19 июля 2010

В Swing-приложении нормально вызывать System.exit() из любого потока? (например, на EDT?)

Ответы [ 6 ]

6 голосов
/ 19 июля 2010

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

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

В вашем основном JFrame вы должны setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE).

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

5 голосов
/ 19 июля 2010

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

3 голосов
/ 19 июля 2010

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

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

Есть очень немного ситуаций, когда JVM действительно нужно было "убить" ...

1 голос
/ 20 июля 2010

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

1 голос
/ 19 июля 2010

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

0 голосов
/ 20 июля 2010

Есть правила Swing для потока EDT, чтобы нормально завершиться.

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...