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

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

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

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

這里做一個(gè)小實(shí)驗(yàn),項(xiàng)目結(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.定義一個(gè)鉤子線程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容器的啟動(dòng)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方法的時(shí)候創(chuàng)建spring容器,然后關(guān)閉,屆時(shí)就會(huì)執(zhí)行之前注冊(cè)的鉤子線程。

打印結(jié)果如下:

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

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

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

1) 程序正常退出;

2) 使用System.exit();

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

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

5)OutOfMemory宕機(jī);

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

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

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

3.finalize()方法

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

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

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

2)寫了一個(gè)測(cè)試類測(cè)試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)這三個(gè)方法的執(zhí)行順序:finally-》Shutdown Hook-》finalize()

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

相關(guān)文章

  • java使用RestTemplate封裝post請(qǐng)求方式

    java使用RestTemplate封裝post請(qǐng)求方式

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

    Java中NIO的三大核心組件詳細(xì)解析

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

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

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

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

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

    詳解Java比較器

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

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

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

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

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

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

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

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

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

    Netty + ZooKeeper 實(shí)現(xiàn)簡(jiǎn)單的服務(wù)注冊(cè)與發(fā)現(xiàn)

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

最新評(píng)論