Что происходит, когда JVM прекращается?
Что происходит, когда 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
было бы убедиться, что новый цикл не запускается, когда выключение уже началось. Является ли мое понимание правильным и полным?