Я просто не понимаю, почему нужно использовать Runtime.addShutdownHook. Если вы хотите выполнить некоторую очистку при выходе jvm, почему бы не просто перегрузить метод finalize класса daemon. В чем преимущество использования метода завершения выключения при завершении метода.
Также существует устаревшая функция runFinalizersOnExit. Если я установлю его на false, я считаю, что финализаторы не будут работать. Это противоречит гарантии java, что финализаторы всегда запускаются перед сборками мусора.