Я уже несколько часов борюсь с этой бессмысленной проблемой, так что теперь я ищу помощи.
1 вкладыш: мой крючок отключения, по-видимому, отключен до того, как завершит свою работу.
Код, который я запускаю, выглядит так:
class Test {
static {
Runtime.getRuntime().addShutdownHook(new Thread(Test::shutdown));
}
// more methods
private static void shutdown() {
Collection<Foo> coll = some.instance.ofHashMap.values();
System.out.println("collSize=" + coll.size());
for (Foo o : coll) {
System.out.println("Calling bar on foo");
o.bar();
}
System.out.println("End of hook");
}
}
Но на выходе получается:
collSize=1
Если я запустил jvm с опцией -server, мне может повезти, и напечатает «Панель вызовов на foo», но она все равно не напечатает «Конец перехвата».
К сожалению, мне не удалось создать короткий исполняемый пример, показывающий проблему. У меня есть один, но он показывает, что все работает нормально, и коллекция повторяется, как и ожидалось. Приведенный выше код представляет собой отрывок из гораздо более крупной программы, над которой я работаю, но мое отключение - это крючок, который не делает ничего, кроме приведенного выше (получить непустую коллекцию и повторить).
Есть идеи о том, что может происходить? Я совершенно потерялся здесь ...
Примечания: - Код написан, скомпилирован и запущен для / с Java 8u45 - Я убиваю программу с помощью Ctrl + C, в результате JVM существует с кодом 130
o.bar()
в своем цикле? - person John Bollinger   schedule 02.10.2015o.bar()
заблокирован и не вернулся. Любые (локальные) ресурсы будут очищены ОС при завершении процесса, поэтому не беспокойтесь о них (дескрипторы открытых файлов, сокеты и т. Д.) - person dsh   schedule 02.10.2015