System.exit (1) существует с кодом возврата 0 в многопоточной программе - PullRequest
4 голосов
/ 07 января 2011

У меня есть вызов System.exit(1) в моей многопоточной программе.Однако время от времени вместо кода возврата 1 программа завершается с кодом возврата 0. У меня нет других вызовов System.exit(), и я уверен, что программа не завершает работу корректно.В чем может быть причина, и как я могу ее избежать?

Обратите внимание, что ошибка прерывистая, и я не могу воспроизвести то же поведение в однопоточных программах.

Ответы [ 3 ]

4 голосов
/ 07 января 2011

Измените свой дизайн, чтобы выполнить более контролируемое отключение.

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

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

Вы вообще использовали Runtime.getRuntime.addShutdownHook()? Вызов System.exit() вызовет любые перехватчики отключения, которые могут быть установлены, и это может изменить код выхода.

1 голос
/ 07 января 2011

Документация для среды выполнения. halt (int) говорит следующее о своем аргументе:

Если метод exit (эквивалентно System.exit) уже был вызван, тоэтот код состояния переопределит код состояния, переданный этому методу.

Так что, возможно, что-то вызывает Runtime.halt(int).В хуке отключения или финализаторе?

0 голосов
/ 07 января 2011

Я думаю, что это может произойти только в том случае, если ваша JVM завершает работу до того, как System.exit(1) действительно выполнится.Как вы думаете, это возможно в вашей системе?

Либо код с System.exit(1) выполняется в потоке демона, и поэтому, когда все другие живые (не демонные) потоки заканчивают работать, JVM завершает работу чисто(или не совсем точно, поскольку вы все равно можете получить 0 код выхода, если ваша программа генерирует исключение!)

В качестве альтернативы, как предположил @Erick Robertson, возможно, что-то изменяет состояние выхода из ловушки или чего-то еще, хотя яЯ не уверен, как это возможно.

Примечание: пожалуйста, не обращайте внимания на мой предыдущий комментарий.Вызов System.exit(1) завершит все запущенные в настоящий момент потоки демона / не демона.

...