iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >通过JDK源码分析关闭钩子详解
  • 344
分享到

通过JDK源码分析关闭钩子详解

jdk源码关闭钩子java 2023-05-30 22:05:41 344人浏览 八月长安
摘要

关闭钩子用户关闭关闭程序,需要做一些善后的清理工作,但问题是,某些用户不会按照推荐的方法关闭应用程序,肯能导致善后工作无法进行。像Tomcat调用server的start方法启动容器,然后会逐级调用start。当发出关闭命令是会启动关闭功能

关闭钩子

用户关闭关闭程序,需要做一些善后的清理工作,但问题是,某些用户不会按照推荐的方法关闭应用程序,肯能导致善后工作无法进行。像Tomcat调用server的start方法启动容器,然后会逐级调用start。当发出关闭命令是会启动关闭功能,但是关闭可能会有一些意外产生,导致应用程序没有进入到我们制定的关闭方法去。如何解决这个问题呢,使得即使有意外也能正常进入关闭流程。

好在java提供了一种优雅的方式去解决这种问题。使得关闭的善后处理的代码能执行。java的关闭钩子能确保总是执行,无论用户如何终止应用程序。除非用户kill,这个是个死穴。

Java提供了Shutdown Hook机制,它让我们在程序正常退出或者发生异常时能有机会做一些清场工作。使用的方法也很简单,Java.Runtime.addShutdownHook(Thread hook)即可。关闭钩子其实可以看成是一个已经初始化了的但还没启动的线程,当JVM关闭时会并发地执行注册的所有关闭钩子。

对java而言,虚拟机会对以下几种操作进行关闭:

      (1)系统调用System.exit()方法

      (2)程序最后一个守护线程退出时,应用程序正常退出。

      (3)用户强行中断程序运行,比如ctrl+c等其他方式中断java程序

关闭钩子的生成:

    1.创建Thread的子类

    2.实现run方法,应用程序关闭时会调用该方法,不需要调用start方法

    3.在应用中实例化关闭钩子类

    4.使用Runtime注册关闭钩子

钩子执行时机

向JVM注册关闭钩子后的什么时候会被调用,什么时候不会被调用呢?分成以下情况:

  • Java程序正常运行完退出时会被调用。
  • windowslinux终端中通过ctrl-c终止命令时会被调用。
  • JVM发生OutOfMemory而退出时会被调用。
  • Java程序中执行System.exit()时会被调用。
  • 操作系统关闭时会被调用。
  • linux通过kill pid(除了kill -9 pid)结束进程时会被调用。
  • windows直接结束进程时不会被调用。

添加删除钩子

钩子的添加和删除都是通过 Runtime 来实现,里面的实现也比较简单,可以看到 addShutdownHook 和 removeShutdownHook 方法都是先通过安全管理器先检查是否有 shutdownHooks 的权限,然后再通过 ApplicationShutdownHooks 添加和删除钩子。

public void addShutdownHook(Thread hook) {  SecurityManager sm = System.getSecurityManager();  if (sm != null) {   sm.checkPermission(new RuntimePermission("shutdownHooks"));  }  ApplicationShutdownHooks.add(hook); }public boolean removeShutdownHook(Thread hook) {  SecurityManager sm = System.getSecurityManager();  if (sm != null) {   sm.checkPermission(new RuntimePermission("shutdownHooks"));  }  return ApplicationShutdownHooks.remove(hook); }

--结束END--

本文标题: 通过JDK源码分析关闭钩子详解

本文链接: https://www.lsjlt.com/news/221751.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 通过JDK源码分析关闭钩子详解
    关闭钩子用户关闭关闭程序,需要做一些善后的清理工作,但问题是,某些用户不会按照推荐的方法关闭应用程序,肯能导致善后工作无法进行。像tomcat调用server的start方法启动容器,然后会逐级调用start。当发出关闭命令是会启动关闭功能...
    99+
    2023-05-30
    jdk源码 关闭钩子 java
  • 通过JDK源码角度分析Long类详解
    概况Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其他类型之间的转换方法。除此之外还有一些位相...
    99+
    2023-05-30
    jdk源码 long类 j
  • 通过JDK源码学习InputStream详解
    概况本文主要给大家介绍了通过JDK源码学习InputStream的相关内容,JDK 给我们提供了很多实用的输入流 xxxInputStream,而 InputStream 是所有字节输入流的抽象。包括 ByteArrayInputStrea...
    99+
    2023-05-30
    inputstream jdk源码 npu
  • nginxpodhook钩子优雅关闭示例详解
    目录一.系统环境二.前言三.pod hook(pod钩子)四.如何优雅的关闭nginx pod一.系统环境 服务器版本docker软件版本Kubernetes(k8s)集群版本CPU...
    99+
    2022-11-13
    nginx pod hook钩子关闭 nginx pod hook
  • vue parseHTML函数源码分析start钩子函数
    这篇文章主要讲解了“vue parseHTML函数源码分析start钩子函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue parseHTML函数源码分析start...
    99+
    2023-07-02
  • vue parseHTML源码解析hars end comment钩子函数
    目录引言chars源码:parseTextend 源码closeElement 源码comment 注释节点描述对象引言 接上文  parseHTML 函数源码解析&nbs...
    99+
    2024-04-02
  • JDK动态代理步骤详解(源码分析)
    动态代理步骤 1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法 2.创建被代理的类以及接口 3.通过Proxy的静态方法 通过Proxy的静态方...
    99+
    2024-04-02
  • Vue八大生命周期钩子函数源码分析
    本篇内容主要讲解“Vue八大生命周期钩子函数源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue八大生命周期钩子函数源码分析”吧!一.速识概念:我们把一个对象从生成(new)到被销毁(d...
    99+
    2023-07-05
  • LKWA靶场通关和源码分析
    文章目录 一、Blind RCE?二、XSSI三、PHP Object Injection四、PHP Object Injection(cookie)五、PHP Object Injectio...
    99+
    2023-09-06
    php web安全
  • DVWA靶场通关和源码分析
    文章目录 一、Brute Force1.low2、medium3、High4、Impossible 二、Command Injection1、Low2、Medium3、High 三、C...
    99+
    2023-09-11
    php web安全
  • Reactcommit源码分析详解
    目录总览commitBeforeMutationEffectscommitMutationEffects插入 dom 节点获取父节点及插入位置判断当前节点是否为单节点在对应位置插入节...
    99+
    2022-11-13
    React commit React commit源码
  • Go channel结构体源码和读写和关闭过程详解
    目录结构体源码发送数据接受数据关闭channel简而言之,channel维护了一个带指针的接受和发送的队列,其中包含mutex锁保证并发安全,数据类型,元素个数,元素大小,chann...
    99+
    2023-05-18
    go channel结构体源码 go channel源码读写
  • Hadoop源码分析二安装配置过程详解
    目录1、 创建用户2、 安装jdk3、 修改hosts4、 配置ssh免密登录5、 安装zookeeper解压:修改配置文件修改内容如下:配置环境变量启动6、 安装hadoop对于三...
    99+
    2024-04-02
  • 通过源码分析Golang cron的实现原理
    目录前言Demo示例源码实现结构体 Cron 和 EntryNew()实现AddFunc()实现Start()实现Run()实现Stop()实现Remove()实现小结前言 gola...
    99+
    2024-04-02
  • 如何通过fastclick源码分析彻底解决tap“点透”
    这篇文章主要为大家展示了“如何通过fastclick源码分析彻底解决tap“点透””,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何通过fastclick源码分...
    99+
    2024-04-02
  • Java ConcurrentHashMap的源码分析详解
    目录概述ForwardingNode节点TreeNodeTreeBinSizeCtl初始化初始化流程查找插入扩容红黑树的读&写读操作写操作小结容器计数总结概述 Concurr...
    99+
    2023-03-02
    Java ConcurrentHashMap源码 Java ConcurrentHashMap
  • Spring配置类源码分析详解
    目录spring配置类解析源码解析配置类解析源码分析判断配置类解析配置类配置类的处理总结扩展点spring配置类解析源码解析 上一篇分析spring的启动过程中,会把BeanDefi...
    99+
    2024-04-02
  • Vue源码分析之虚拟DOM详解
    为什么需要虚拟dom? 虚拟DOM就是为了解决浏览器性能问题而被设计出来的。例如,若一次操作中有10次更新DOM的动作,虚拟DOM不会立即操作DOM,而是将这10次更新的diff内...
    99+
    2024-04-02
  • java集合类源码分析之Set详解
    Set集合与List一样,都是继承自Collection接口,常用的实现类有HashSet和TreeSet。值得注意的是,HashSet是通过HashMap来实现的而TreeSet是通过TreeMap来实现的,所以HashSet和TreeS...
    99+
    2023-05-31
    java 集合类源码 set
  • Java struts2请求源码分析案例详解
      Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作