Что происходит, когда JVM завершается с помощью System.exit(0)
или ^C
или чего-либо подобного? Я читаю такие вещи, как "процесс просто сдулся" и "каждый отдельный поток остановлен", но я хотел бы знать, что именно происходит. Я уже знаю, что есть shutdownHook
который каким-то образом все еще выполняется, но что происходит до того, как shutdownHooks вызываются, и происходит ли что-нибудь после завершения всех этих потоков?
Я хотел бы правильно реализовать такой shutdownHook
и для этого мне нужно сделать правильные предположения о том, что еще может быть выполнено, а что нет.
Обновить:
некоторый код:
class SomeObject {
private boolean stopped;
SomeObject() {
stopped = false;
Thread hook = new Thread() {
@Override
public void run() {
stopped = true;
}
};
hook.setPriority(Thread.MAX_PRIORITY);
Runtime.getRuntime().addShutdownHook(hook);
}
boolean map(Iterator<Object> it) {
while(it.hasNext() && !stopped) {
writeToOtherObject(it.next());
it.remove();
}
//have calculations finished?
return !it.hasNext();
}
}
Функция map
вычисляет результаты, собранные в каком-то другом объекте. Этот объект должен храниться в каком-то файле до того, как все будет разбито (по обычному приоритету shutdownHook
тоже). Имеет ли смысл shutdownHook
здесь? Насколько я понимаю, все потоки сначала уничтожаются, и только после этого запускается shutdownHook
(одновременно, но я предполагаю, что сначала запускаются потоки с высоким приоритетом...), а затем объекты завершаются. Это делает приведенный выше код довольно бесполезным, поскольку целью этого shutdownHook
было бы убедиться, что новый цикл не запускается, когда завершение работы уже началось. Является ли мое понимание правильным и полным?