Потоки, не являющиеся демонами, не будут препятствовать завершению программы при вызове System.exit()
(а потоки демонов, конечно, не будут), но перехватчики завершения † будут, если они не завершатся.
† См. Конструкция API отключающих хуков (первоначально связанная статья теперь доступна только на обратная машина ).
Swing, вероятно, использует ловушки завершения работы, но не таким образом, чтобы предотвратить завершение вашей программы.Но если вы (или какая-либо библиотека, которую вы используете) звоните Runtime.addShutdownHook()
, вам лучше убедиться, что ваши перехватчики не блокируются.
Кстати, один обходной путь дляэта проблема состоит в том, чтобы добавить хук отключения, который запускает другой поток, который ждет шестьдесят секунд, а затем вызывает Runtime.halt()
.(Вы должны раскрутить другой поток, потому что в противном случае перехватчик, ожидая шестьдесят секунд, не даст программе завершиться в течение шестидесяти секунд.)