首页 > 编程语言 >Java关闭挂钩(shutdown hook)

Java关闭挂钩(shutdown hook)

时间:2024-05-27 09:05:12浏览次数:27  
标签:Java 关闭 Thread hook exit shutdown Runtime public

当JVM正常或突然关闭时,关闭挂钩可用于执行清理资源或保存状态。 执行干净资源意味着关闭日志文件,发送一些警报或其他内容。 因此,如果要在JVM关闭之前执行某些代码,请使用关闭挂钩(shutdown hook)。

JVM什么时候关闭?
JVM在以下情况下关闭:

  • 用户在命令提示符下按ctrl + c
  • 调用System.exit(int)方法
  • 用户注销计算机。
  • 用户关闭计算机等

addShutdownHook(Thread hook)方法
Runtime类的addShutdownHook()方法用于向虚拟机注册线程。

语法如下:

public void addShutdownHook(Thread hook){}

Java

可以通过调用静态工厂方法getRuntime()来获取Runtime类的对象。 例如:

Runtime r = Runtime.getRuntime();

Java

工厂方法
返回类实例的方法称为工厂方法。

Shutdown Hook的简单示例
package com.yiibai;

class MyThread extends Thread{
    public void run(){
        System.out.println("shut down hook task completed..");
    }
}

public class TestShutdown1{
    public static void main(String[] args)throws Exception {

        Runtime r=Runtime.getRuntime();
        r.addShutdownHook(new MyThread());

        System.out.println("Now main sleeping... press ctrl+c to exit");
        try{Thread.sleep(3000);}catch (Exception e) {}
    }
}

Java

执行上面示例代码,得到以下结果:

Now main sleeping... press ctrl+c to exit
shut down hook task completed..

Process finished with exit code 0

Shell

注意: 可以通过调用Runtime类的halt(int)方法来停止关闭序列。

使用匿名类的Shutdown Hook示例:
package com.yiibai;

public class TestShutdown2{
    public static void main(String[] args)throws Exception {

        Runtime r=Runtime.getRuntime();

        r.addShutdownHook(new Thread(){
                              public void run(){
                                  System.out.println("shut down hook task completed..");
                              }
                          }
        );

        System.out.println("Now main sleeping... press ctrl+c to exit");
        try{Thread.sleep(3000);}catch (Exception e) {}
    }
}

Java

执行上面示例代码,得到以下结果:

Now main sleeping... press ctrl+c to exit
shut down hook task completed..

Process finished with exit code 0

标签:Java,关闭,Thread,hook,exit,shutdown,Runtime,public
From: https://blog.csdn.net/unbelievevc/article/details/139225782

相关文章

  • Java 线程池优化
    1.Java线程池优化1.1.核心线程数1.2.任务队列1.2.1.LinkedBlockingQueue1.2.2.ArrayBlockingQueue1.2.3.SynchronousQueue1.2.4.总结1.3.最大线程数1.4.线程存活时间1.5.拒绝策略1.5.1.AbortPolicy(默认策略)1.5.2.CallerRunsPolicy1.5.3.DiscardPo......
  • java可变参数
     展示了如何使用可变参数(varargs)来处理不同数量的参数输入/***@author:javaRao*@date:Createdin2023-06-3015:41*@description:*/publicclassMod7{publicstaticvoidmain(String[]args){//调用ar方法,传递一个参数ar(1);......
  • Java中生成二维码转为base64存入MySQL数据库中
    1.引入架包<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing</groupId>......
  • 零基础学Java第二十三天之网络编程
    网络编程1.网络编程实现多台计算机之间实现数据的共享和传递,网络应用程序主要组成为:网络编程+IO流+多线程2.网络编程三要素网络通讯的模型:请求-响应,客户端-服务端三要素:IP地址,端口,协议(数据传输的规则)2.1.IP地址IP地址:网络中计算机的唯一标识(IP地址是一个32位的二......
  • 零基础学Java第二十三天之网络编程Ⅱ
    1.InetAddress类用来表示主机的信息练习:C:\Windows\system32\drivers\etc\hosts一个主机可以放多个个人网站www.baidu.com/14.215.177.37www.baidu.com/14.215.177.38www.taobao.com/183.61.241.252www.taobao.com/121.14.89.2532.Socket3.TCP编程API:Socket,S......
  • 分析JAVA打印流的自动刷新
    参考:https://blog.csdn.net/xshsjl/article/details/77076235参考:https://blog.csdn.net/weixin_43369921/article/details/111397253今天遇到了一个奇怪的事情,使用打印流,有一个自动刷新的参数,但设不设置结果貌似没啥影响,下面来研究研究publicPrintStream(OutputStreamout,......
  • (读后分享)移动Web前端高效开发实战:HTML 5 + CSS 3 + JavaScript + Webpack + React Nat
    链接:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqso提取码:jqsoHTML5新特性与应用:介绍HTML5的新特性,包括语义化标签、本地存储、设备兼容、连接特性等,并讲解如何在移动Web前端开发中充分利用这些特性提升用户体验。CSS3样式与动画设计:详细讲解CSS3的样式设计和动画效果,包......
  • 【Java笔记】第8章:面向对象的三大特性(封装、继承、多态)
    前言1.三大特性概述2.封装3.继承4.多态结语#include<GUIQU.h>intmain{上期回顾:【Java笔记】第7章:面向对象个人主页:C_GUIQU归属专栏:【Java学习】return一键三连;}前言各位小伙伴大家好!上期小编给大家讲解了Java中的面向对象,接下来讲讲Java中面向......
  • idea启动报错:java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory
    文章目录一、问题二、解决方法一、问题问题描述:idea整合Mybatis-plus的时候,启动报错:java.lang.NoClassDefFoundError:org/mybatis/logging/LoggerFactory二、解决方法可能原因:仔细检查了一下,发现mybatis-spring-boot-starter的包和mybatis-plus-boot-starter的......
  • JDBC & 数据库连接池:详述Java 数据库操作的基础,数据库连接池的使用以及原理,比较常用数
    JDBC基础 JDBC的定义和目的 JDBC(JavaDatabaseConnectivity)是一个用于执行SQL语句的JavaAPI,可以与多种关系数据库进行交互,这的API由一组用Java语言编写的类和接口组成。 JDBC鼓励供应商使用JDBC驱动程序,该驱动程序可以通过数据库管理系统的客户机接口与各个数......