Как я могу закрыть свое программное обеспечение безопасным способом? - PullRequest
5 голосов
/ 21 апреля 2010

До сих пор я использовал свое приложение как самостоятельный продукт. Итак, когда пользователь нажал кнопку «Стоп», я позвонил System.exit(0);, и все было в порядке.

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

Итак, как правильно закрыть приложение, если получен соответствующий запрос от внешнего программного обеспечения? Мое приложение представляет собой приложение с графическим интерфейсом. Итак, я хочу закрыть окно, но я также хочу закрыть все процессы, выполняемые моей программой.

ДОБАВЛЕНО:

Если быть более точным, я хочу закрыть все темы, запущенные моей программой. Моя программа не запускает процесс ОС или любую другую программу.

Ответы [ 4 ]

2 голосов
/ 21 апреля 2010

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

Вы должны убедиться, что все ваши потоки "счастливы" умереть, прежде чем вызывать System.exit.

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

Существует множество различных способов реализации отравления, вы можете просто установить глобальную переменную флага, которую потоки проверят, чтобы убедиться, что они не отравлены, или вы можете использовать библиотеки потоков Java 5. Взгляните на этот Javadoc, например, и вы найдете ссылки на эту технику:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

0 голосов
/ 21 апреля 2010

Я рекомендую сделать пометку, чтобы остановить поток, чтобы поток знал, когда он должен остановиться. Для графического интерфейса и окна вы можете вызвать frame.dispose ().

Для System.exit (), я думаю, что это не повлияет на вызывающего, вы можете попытаться увидеть, каков реальный эффект, но, как уже рекомендовали другие люди, не вызывайте его прямо так, просто дайте потокам остановиться сама

0 голосов
/ 21 апреля 2010

На этот вопрос есть однозначный ответ, который, к сожалению, является заменой System.exit.

Как правило, вам нужно установить какой-либо флаг, который сигнализирует всем вашим потокам о том, что пора выходить, и убедитесь, что они регулярно проверяют этот флаг. Это позволит им изящно вымыться, не останавливаясь внезапно, и также гарантирует, что эффекты ограничены вашими собственными компонентами. В этом случае основной поток вашего приложения также будет наблюдать флаг, ждать завершения всех потоков типа «рабочий», а затем будет возвращать весь стек вверх, пока не будет достигнута точка входа вашего приложения.

Этот вопрос не слишком отличается от устаревших Thread.stop (и т. Д.) Методов, особенно в том, что касается замены System.exit чем-то более уважительным. В этом свете почему не рекомендуется Thread.stop () страница может быть полезным для чтения.

Создание исключения (пользовательское, называемое что-то вроде ApplicationStopException) для размотки стека основного потока - не такая уж плохая идея; это избавляет вас от необходимости обрабатывать специальную логику во всем коде и вместо этого позволяет «сообщению» распространяться на более высокие уровни, где они могут предпринять любое действие, необходимое для изящного выхода из вашей программы.

0 голосов
/ 21 апреля 2010

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

С Javadoc System.exit Завершает работающую в данный момент виртуальную машину Java)

EDIT: Если вы хотите очистить код перед выключением, http://java.sun.com/j2se/1.4.2/docs/guide/lang/hook-design.html

...