欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java虛擬機鉤子關(guān)閉函數(shù)addShutdownHook的操作

 更新時間:2021年02月20日 11:42:44   作者:lijie_cq  
這篇文章主要介紹了java虛擬機鉤子關(guān)閉函數(shù)addShutdownHook的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

當(dāng)jvm虛擬機被關(guān)閉的時候,可能我們需要做一些處理,比如對連接的關(guān)閉,或者對一些必要信息的存儲等等操作,這里就可以借助于虛擬機提供的鉤子函數(shù),當(dāng)jvm虛擬機關(guān)閉之前會去調(diào)用addShutdownHook注冊的線程鉤子。

這里做一個小實驗,項目結(jié)構(gòu)如下:

1.自定義的ApplicationContext的上下文

package cn.lijie;
public class ApplicationContext {
  private static ApplicationContext application;
  private void init() {
    application = this;
    Runtime.getRuntime().addShutdownHook(new MyShutdownHook());
  }
  public void close() {
    System.out.println("鉤子函數(shù)關(guān)閉連接操作");
  }
  public static ApplicationContext getApplication() {
    return application;
  }
}

2.定義一個鉤子線程MyShutdownHook

package cn.lijie;
public class MyShutdownHook extends Thread {
  public void run() {
    System.out.println("鉤子函數(shù)調(diào)用,準(zhǔn)備關(guān)閉連接");
    ApplicationContext.getApplication().close();
    System.out.println("鉤子函數(shù)調(diào)用,連接已經(jīng)關(guān)閉");
  }
}

3.spring容器的啟動main

package cn.lijie;
public class ApplicationContext {
  private static ApplicationContext application;
  private void init() {
    application = this;
    Runtime.getRuntime().addShutdownHook(new MyShutdownHook());
  }
  public void close() {
    System.out.println("鉤子函數(shù)關(guān)閉連接操作");
  }
  public static ApplicationContext getApplication() {
    return application;
  }
}

4.application.xml

<bean name="application" class="cn.lijie.ApplicationContext" init-method="init" />

當(dāng)執(zhí)行main方法的時候創(chuàng)建spring容器,然后關(guān)閉,屆時就會執(zhí)行之前注冊的鉤子線程。

打印結(jié)果如下:

補充:JAVA虛擬機關(guān)閉鉤子(Shutdown Hook)、finally(try,catch)、finalize()調(diào)用場景及執(zhí)行順序

JAVA虛擬機關(guān)閉鉤子(Shutdown Hook)、finally(try,catch)、finalize(),三者都能在虛擬機關(guān)閉前做一些操作,但是調(diào)用場景和執(zhí)行順序不一樣。

1. JAVA虛擬機關(guān)閉鉤子(Shutdown Hook)在下面場景下被調(diào)用:

1) 程序正常退出;

2) 使用System.exit();

3) 終端使用Ctrl+C觸發(fā)的中斷;

4)系統(tǒng)關(guān)閉;

5)OutOfMemory宕機;

6) 使用Kill pid命令干掉進程(注:在使用kill -9 pid時,是不會被調(diào)用的);

2. finally(try...catch..)

當(dāng)try里面的代碼引起的錯誤導(dǎo)致虛擬機關(guān)閉前,執(zhí)行finally;

3.finalize()方法

虛擬機垃圾回收過程中執(zhí)行的方法;

4.三個方法的執(zhí)行順序

1) 從java的API文檔介紹可得Shutdown Hook會在finalize()之前執(zhí)行:

2)寫了一個測試類測試finally和Shutdown Hook的執(zhí)行順序,可以看出finally在Shutdown Hook之前執(zhí)行:

package Test; 
public class ShutDownHookTest { 
  public static void main(String[] args) {
    try {
      new ShutDownHookTest().addShutdownHook();
      String strs= "hello";
      strs.charAt(8);     
    }catch(Exception e) {
      e.printStackTrace();
    }finally {
      System.out.println("執(zhí)行了finally!");
    }
  }  
  public void addShutdownHook() {
    Runtime.getRuntime().addShutdownHook(new Thread() {
      public void run() {
        try {           
          System.out.println("執(zhí)行了ShutdownHook!");
        } catch (Throwable t) {
          t.printStackTrace();
        }
      }
     });
  }
}

3)這三個方法的執(zhí)行順序:finally-》Shutdown Hook-》finalize()

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • java使用RestTemplate封裝post請求方式

    java使用RestTemplate封裝post請求方式

    這篇文章主要介紹了java使用RestTemplate封裝post請求方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java中NIO的三大核心組件詳細解析

    Java中NIO的三大核心組件詳細解析

    這篇文章主要介紹了Java中NIO的三大核心組件詳細解析,NIO的Buffer類是一個抽象類,位于java.nio包中,提供了一組更加有效的方法,用來進行寫入和讀取的交替訪問,本質(zhì)上是一個內(nèi)存塊,既可以寫入數(shù)據(jù),也可以從中讀取數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • Java基于自定義類加載器實現(xiàn)熱部署過程解析

    Java基于自定義類加載器實現(xiàn)熱部署過程解析

    這篇文章主要介紹了Java基于自定義類加載器實現(xiàn)熱部署過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Java的logback自定義日志脫敏組件詳解

    Java的logback自定義日志脫敏組件詳解

    這篇文章主要介紹了Java的logback自定義日志脫敏組件詳解,一個項目在書寫了很多打印日志的代碼,但是后面有了脫敏需求,如果我們?nèi)ナ謩痈膭哟a,會花費大量時間,如果引入本組件,完成配置即可輕松完成脫敏,需要的朋友可以參考下
    2023-11-11
  • 詳解Java比較器

    詳解Java比較器

    這篇文章主要介紹了Java比較器的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • java中匿名內(nèi)部類詳解

    java中匿名內(nèi)部類詳解

    這篇文章主要對java中的匿名內(nèi)部類的詳細總結(jié),需要的朋友可以參考下
    2017-04-04
  • 關(guān)于Java創(chuàng)建線程的2種方式以及對比

    關(guān)于Java創(chuàng)建線程的2種方式以及對比

    這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建線程的2種方式以及對比的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • Java工程mybatis實現(xiàn)多表查詢過程詳解

    Java工程mybatis實現(xiàn)多表查詢過程詳解

    這篇文章主要介紹了Java工程mybatis實現(xiàn)多表查詢過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java中的Kafka為什么性能這么快及4大核心詳析

    Java中的Kafka為什么性能這么快及4大核心詳析

    這篇文章主要介紹了Java中的Kafka為什么性能這么快及4大核心詳析,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Netty + ZooKeeper 實現(xiàn)簡單的服務(wù)注冊與發(fā)現(xiàn)

    Netty + ZooKeeper 實現(xiàn)簡單的服務(wù)注冊與發(fā)現(xiàn)

    服務(wù)注冊和發(fā)現(xiàn)一直是分布式的核心組件。本文介紹了借助 ZooKeeper 做注冊中心,如何實現(xiàn)一個簡單的服務(wù)注冊和發(fā)現(xiàn)。,需要的朋友可以參考下
    2019-06-06

最新評論