Tomcat源码解析(14)

本文介绍了Java中关闭钩子的使用方法及其重要性。通过注册关闭钩子,可以确保在程序正常或异常退出时执行必要的清理操作。文章还提供了示例代码并解释了Tomcat服务器如何利用这一机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关闭钩子

  很多时候,用户关闭程序后需要做一些清理。有时候,并不按照推荐的方法关闭应用程序,有可能不做清理工作。

使用关闭钩子,确保清理代码总是能够执行,无论用户如何终止应用程序。

java虚拟机,会对两类事件进行响应,然后执行关闭操作。

1.调用System.exit()或程序最后一个非守护进程线程退出,应用程序正常退出。

2.用户强制虚拟机中断运行

虚拟机关闭的时候

  虚拟机启动所有注册的关闭钩子。关闭钩子通过runtime类注册线程,所有关闭钩子会并发执行。 

  虚拟机根据情况调用,所有没有被调用过的终结器(finalizer)

创建一个Thread类的子类

实现你自己的run()方法

实例化关闭钩子类

使用当前Runtime类的addShutdownHook(),注册关闭钩子。不需要调用start方法。

public class ShutdownHookDemo(){
  public void start(){
    ShutdownHook shutdownHook = new ShutdownHook();
    Runtime.getRuntime().addShutdownHook(ShutdownHook);
  }
  
  public static void main(String[] args){
    ShutdownHookDemo demo = ShutdownHookDemo();
    demo.start();
  } 

  class ShutdownHook extends Thread{
      public void run(){

     }
  }

}

Tomcat中的关闭钩子

   Catalina类负责启动 和 管理其他组件的server对象。 它里面有一个内部类CatalinaShutdownHook的内部类,继承自Thread。它会调Server对象的stop()

  Catalina实例启动时,会实例化关闭钩子,在一阶段添加到Runtime类中。

  

protected class CatalinaShutdownHook extends Thread{
   public void run(){
     if(server !=null){
        ((Lifecycle) server).stop();
      }
   }

}

解决:你不能设定用户总是正常退出。关闭钩子,可以使你,无论发生什么,清理代码总是可以被执行。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值