正常关闭:
1.当最后一个“正常(非守护)”线程结束时
2.当调用System.exit时
3.通过其它特定于平台的方法关闭(例如发送了SIGINT信号或键入Ctrl+C)
强行关闭:
1.调用Runtime.halt
2.在操作系统中“杀死”JVM进程(例如发送SIGKILL)
1.关闭钩子(Shutdown Hook)
关闭钩子指通过Runtime.addShutdownHook注册的但尚未开始的线程。JVM并不能保证关闭钩子的调用顺序,在关闭应用程序线程时,如果有(守护或非守护)线程仍然在运行,那么这些线程接下来将与关闭进程并发执行。当所有的关闭钩子都执行结束时,如果runFinalizersOnExit为true,那么JVM将运行终结器,然后再停止。
JVM并不会停止或中断任何在关闭时仍然运行的应用程序线程。当JVM最终结束时,这些线程将被强行结束。如果关闭钩子或终结器没有执行完成,那么正常关闭进程“挂起”并且JVM必须被强制关闭,当被强制关闭时,只是关闭JVM,而不会运行关闭钩子。
关闭钩子应该是线程安全的:它们在访问共享数据时必须使用同步机制,并且小心地避免发生死锁,这与其它并发代码的要求相同。而且,关闭钩子不应该对应用程序的状态(例如,其它服务是否已经关闭,或者所有的正常线程是否已经执行完成)或者JVM的关闭原因做出任何假设。最后,关闭钩子必须尽快退出,否则会延迟JVM的结束时间。
关闭钩子的作用:
1.