На этот вопрос есть однозначный ответ, который, к сожалению, является заменой System.exit.
Как правило, вам нужно установить какой-либо флаг, который сигнализирует всем вашим потокам о том, что пора выходить, и убедитесь, что они регулярно проверяют этот флаг. Это позволит им изящно вымыться, не останавливаясь внезапно, и также гарантирует, что эффекты ограничены вашими собственными компонентами. В этом случае основной поток вашего приложения также будет наблюдать флаг, ждать завершения всех потоков типа «рабочий», а затем будет возвращать весь стек вверх, пока не будет достигнута точка входа вашего приложения.
Этот вопрос не слишком отличается от устаревших Thread.stop
(и т. Д.) Методов, особенно в том, что касается замены System.exit чем-то более уважительным. В этом свете почему не рекомендуется Thread.stop () страница может быть полезным для чтения.
Создание исключения (пользовательское, называемое что-то вроде ApplicationStopException
) для размотки стека основного потока - не такая уж плохая идея; это избавляет вас от необходимости обрабатывать специальную логику во всем коде и вместо этого позволяет «сообщению» распространяться на более высокие уровни, где они могут предпринять любое действие, необходимое для изящного выхода из вашей программы.