Runtime.getRuntime().addShutdownHook这个和ServletContextListener的public void contextDestroyed(ServletContextEvent arg0) 都是什么情况下触发,示例说明一下
时间: 2024-09-25 07:17:06 浏览: 26
详解Java8与Runtime.getRuntime().availableProcessors()
`Runtime.getRuntime().addShutdownHook()` 和 `ServletContextListener` 的 `contextDestroyed(ServletContextEvent arg0)` 都是在系统或应用程序关闭过程中被触发。
1. `Runtime.getRuntime().addShutdownHook(Thread shutdownHook)` 这段代码是在Java运行时环境中,当JVM(Java虚拟机)接收到操作系统关机信号(如强制重启、断电等)时,会执行注册的`shutdownHook`线程。例如:
```java
Thread hook = new Thread(() -> {
System.out.println("Running shutdown hook...");
// 这里可以放置清理资源的操作,比如关闭数据库连接、停止服务等
});
Runtime.getRuntime().addShutdownHook(hook);
```
当JVM正常退出时,不会执行这个hook,只有在非正常关闭时才会执行。
2. `public void contextDestroyed(ServletContextEvent arg0)` 是 Servlet API 中的生命周期回调,它会在Servlet容器关闭、卸载Web应用时被调用。例如,在Spring MVC中,`WebApplicationInitializer` 类的 `configure` 方法中可能会创建一个 `ServletContextListener` 实现,然后在 `contextDestroyed` 方法中处理应用结束前的任务:
```java
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 初始化操作...
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Web application is shutting down...");
// 这里可以释放资源,关闭数据源等
}
}
```
在这个例子中,当你部署的应用被服务器关闭或停止时,`contextDestroyed` 方法会被调用。
阅读全文