Когда крюки выключения ломаются плохо - PullRequest
9 голосов
/ 17 ноября 2011

Если я добавлю ловушку отключения во время выполнения моей 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());

... тогда будут когда-либо любые ситуации, когда это *Метод 1008 * не будет выполняться, когда программа / Java / OS нормально завершает работу, аварийно завершает работу или неожиданно завершает работу?Если да, то какие ситуации могут обойти хук отключения Runtime и почему?

Ответы [ 5 ]

6 голосов
/ 17 ноября 2011
  • Если процесс завершен, отключение не будет выполнено.

  • Если процесс завершится сбоем, перехват выключения не будет выполнен.

  • Если у вас есть служба Windows, и перехват выключения занимает много временивыполнить, оно будет прекращено.

3 голосов
/ 17 ноября 2011

Если вы вытащите вилку из задней части компьютера, то отключающий крюк не сработает.Другие ситуации включают в себя:

  • Процесс, прерываемый в операционной системе POSIX с помощью SIGKILL (-9).
  • Аналогичным образом, если вы решите прекратить «не отвечающий» процесс под Windows, закрытиевниз может не завершиться.
0 голосов
/ 17 ноября 2011

В любое время, когда JVM может выйти изящно, запускается крюк отключения. Не запускается, если:

  • JVM падает. (В зависимости от того, как / когда он выходит из строя, крючок может по-прежнему работать, но никаких гарантий не предоставляется)
  • JVM получает SIGKILL или аналогичный и немедленно останавливается ОС
0 голосов
/ 17 ноября 2011

когда вы выполняете Runtime.getRuntime().halt() JVM или когда ОС убивает процесс, не позволяя ему выполнить какую-либо очистку, также, когда у вас есть eclipse, завершите программу (при запуске ее под eclipse)

0 голосов
/ 17 ноября 2011

Они запускаются, только если процесс "нормально выключается".Если процесс принудительно завершается из-за операционной системы или происходит сбой из-за проблем с ресурсами (например, из-за нехватки памяти), перехватчики завершения не будут вызываться.

...