Я только что столкнулся с интересной проблемой. Кажется, что если в Java поток вызывает System.exit()
, он не может быть присоединен через Thread.join()
.
Это вызывает у меня проблемы, так как я хочу использовать перехватчик выключения для очистки после моего приложения, например:
Runtime.getRuntime.addShutdownHook(new Thread() {
public void run() {
reader.join();
writer.join();
in.close();
out.close();
}
});
Идея состоит в том, что он гарантирует, что потоки завершили работу со своими соответствующими ресурсами, прежде чем закрыть эти ресурсы. Проблема в том, что есть 3 ситуации, в которых может быть вызван хук выключения. Они есть:
- Пользователь нажимает [ctrl] + [C].
- Поток чтения завершается и вызывает
System.exit()
. - Поток записи завершается и вызывает
System.exit()
.
Первый случай, когда пользователь нажимает [ctrl] + [C], работает нормально. Но в любом из двух других случаев хук выключения блокируется навсегда. Это косвенный эффект того факта, что один Thread.join()
, который вызывается для потока, уже вызвавшего System.exit()
, блокируется навсегда.
Таким образом, у меня есть 2 вопроса. Во-первых, я знаю, что вместо этого я мог бы использовать Thread.join(long millis)
, чтобы они не блокировались на неопределенный срок, но может ли кто-нибудь придумать более элегантное решение? Во-вторых, хотя можно дважды вызвать Thread.join()
для одного и того же потока, и во втором случае он просто немедленно вернется, кто-нибудь знает причину, по которой вызов Thread.join()
для потока, который уже вызвал System.exit()
, блокируется на неопределенный срок, а не просто возвращается сразу?
System.exit()
и вместо этого организовать надлежащую очистку и позволить JVM завершиться естественным образом? - person assylias   schedule 18.07.2013System.exit()
вызывается после того, как виртуальная машина начала свою последовательность завершения работы, то, если выполняются перехватчики выключения, этот метод будет блокироваться на неопределенный срок. - вы случайно не вызываетеSystem.exit()
дважды? (Справочник ) - person assylias   schedule 18.07.2013