Я просто столкнулся с интересной проблемой. Кажется, что если в Java поток вызывает System.exit()
, он не может быть присоединен через Thread.join()
.Java Threads and Shutdown Hook
Это вызывает у меня вопросы, как я хочу использовать отключения крюк для очистки после моего заявления, такие как:
Runtime.getRuntime.addShutdownHook(new Thread() {
public void run() {
reader.join();
writer.join();
in.close();
out.close();
}
});
Идея заключается в том, что он гарантирует, что нити закончили с их соответствующими ресурсами, до закрытия этих ресурсов. Проблема состоит в том, что есть три ситуации, с помощью которых может быть выведен крюк выключения. Они:
- Пользователь нажимает [ctrl] + [C].
- Поток для чтения завершается и вызывает
System.exit()
. - Writer thread завершает и вызывает
System.exit()
.
Первый случай, когда пользователь нажимает [ctrl] + [C], работает нормально. Но в любом из двух других случаев блокировка блокировки блокируется навсегда. Это эффект детонации того факта, что один Thread.join()
, который вызывается против потока, уже названного System.exit()
, блокирует навсегда.
Таким образом, у меня есть 2 вопроса. Во-первых, я знаю, что вместо этого могу использовать Thread.join(long millis)
, чтобы они не блокировались бесконечно, но может ли кто-нибудь подумать о более элегантном решении? Во-вторых, хотя можно вызвать Thread.join()
против одного и того же потока дважды, а во втором случае он сразу же вернется сразу, кто-нибудь знает причину, почему вызов Thread.join()
против потока, который уже вызвал System.exit()
, блокирует неопределенное время и не сразу возвращается сразу?
Почему бы не попытаться избежать вызова 'System.exit()' и вместо этого организовать правильную очистку и позволить JVM выйти естественным путем? – assylias
Также обратите внимание на то, что «* Если' System.exit() 'вызывается после того, как виртуальная машина начала свою последовательность выключения, тогда, если запускаются затворы остановки, этот метод будет блокироваться бесконечно. *" - вы называете 'System.exit() 'дважды случайно? ([Ссылка] (http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exit%28int%29)) – assylias