Когда крюки выключения ломаются плохо
Если я добавлю хук завершения работы моей Java-программы следующим образом:
public class MyShutdownHook implements Runnable
{
@Override
public void run()
{
// Stuff I want executed anytime
// the program, Java, or the OS exits normally,
// crashes, or terminates unexpectedly for any reason.
}
}
// The in another method...
Runtime.getRuntime().addShutdownHook(new MyShutdownHook());
... тогда бывают ли ситуации, когда это run()
метод не будет выполняться, когда программа /Java/OS завершается нормально, аварийно завершает работу или завершается? Если так, то какие ситуации могли бы обойти Runtime
отключить крючок, а почему?
5 ответов
Если процесс завершен, отключение не будет выполнено.
Если процесс завершается сбоем, отключение не будет выполнено.
Если у вас есть служба Windows, и завершение работы завершается, перехват завершается.
Если вы вытащите вилку из задней части компьютера, то отключающий крюк не сработает. Другие ситуации включают в себя:
- Процесс завершается на POSIX OS с помощью SIGKILL (-9).
- Точно так же, если вы решите прекратить "не отвечающий" процесс под Windows, завершающий хук может не завершиться.
В любое время, когда JVM может выйти изящно, запускается крюк отключения. Он не запускается, если:
- JVM падает. (В зависимости от того, как / когда он выходит из строя, крючок все еще может работать, но никаких гарантий не делается)
- JVM получает SIGKILL или аналогичный и немедленно останавливается ОС
Они запускаются, только если процесс "нормально выключается". Если процесс принудительно завершается из-за операционной системы или происходит сбой из-за проблем с ресурсами (например, из-за нехватки памяти), перехватчики завершения не будут вызываться.
Когда вы делаете Runtime.getRuntime().halt()
JVM или когда ОС убивает процесс, не позволяя ему выполнить какую-либо очистку, также, когда у вас есть eclipse, завершите программу (при запуске ее в eclipse)