System.exit()
pode ser usado para executar ganchos de desligamento antes do encerramento do programa. Essa é uma maneira conveniente de lidar com o desligamento em programas maiores, onde todas as partes do programa não podem (e não deveriam) estar cientes uma da outra. Então, se alguém quiser sair, ele pode simplesmente ligarSystem.exit()
e os ganchos de desligamento (se configurados corretamente) cuidam de realizar todas as cerimônias de desligamento necessárias, como fechar arquivos, liberar recursos etc.
"Este método nunca retorna normalmente." significa apenas que o método não retornará; uma vez que um thread chegue lá, ele não voltará.
Outra maneira, talvez mais comum, de sair de um programa é simplesmente chegar ao final do main
método. Porém, se houver algum encadeamento que não seja daemon em execução, eles não serão encerrados e, portanto, a JVM não sairá. Portanto, se você tiver algum desses threads não daemon, precisará de outros meios (além dos ganchos de encerramento) para desligar todos os threads não daemon e liberar outros recursos. Se não houver outros encadeamentos que não sejam daemon, retornar de main
encerrará a JVM e chamará os ganchos de encerramento.
Por alguma razão, os ganchos de desligamento parecem ser um mecanismo subvalorizado e incompreendido, e as pessoas estão reinventando a roda com todos os tipos de hacks personalizados proprietários para encerrar seus programas. Eu recomendaria o uso de ganchos de desligamento; está tudo no Runtime padrão que você usará de qualquer maneira.