精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java并發編程:優雅的關閉鉤子(Shutdown Hook)

開發 前端
當程序即將退出時(例如釋放資源、關閉數據庫連接等),可以通過預先注冊一個或多個關閉鉤子線程(Shutdown Hook)來執行相關操作。當 JVM 進程準備退出時,這些鉤子線程會被觸發并運行。

關閉鉤子簡介

當程序即將退出時(例如釋放資源、關閉數據庫連接等),可以通過預先注冊一個或多個關閉鉤子線程(Shutdown Hook)來執行相關操作。當 JVM 進程準備退出時,這些鉤子線程會被觸發并運行。

示例代碼:

public class HookThreadDemo {
    privatestaticclass HookRunnable implements Runnable {
        @Override
        public void run() {
            try {
                System.out.println("鉤子線程 " + Thread.currentThread().getName() + " 正在執行...");
                Thread.sleep(2000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("鉤子線程 " + Thread.currentThread().getName() + " 執行結束");
        }
    }

    public static void main(String[] args) {
        HookRunnable hookRunnable = new HookRunnable();
        // 添加鉤子線程 0
        Runtime.getRuntime().addShutdownHook(new Thread(hookRunnable));
        // 添加鉤子線程 1
        Runtime.getRuntime().addShutdownHook(new Thread(hookRunnable));
        System.out.println("主線程即將結束執行");
    }
}

輸出結果:

主線程即將結束執行
鉤子線程 Thread-0 正在執行...
鉤子線程 Thread-1 正在執行...
鉤子線程 Thread-1 執行結束
鉤子線程 Thread-0 執行結束

當主線程執行完畢后,JVM 進程退出前,所有注冊的鉤子線程會被啟動并執行。

關閉鉤子應用場景

  1. 釋放資源:關閉文件句柄、數據庫連接等,避免資源泄漏。
  2. 停止服務:安全關閉服務器,確保所有請求處理完畢。
  3. 發送通知:通過郵件或短信通知用戶服務已停止。
  4. 記錄日志:保存系統狀態或錯誤信息,便于后續排查問題。

數據庫連接實戰演示

以下代碼演示如何用關閉鉤子關閉數據庫連接:

public class DatabaseConnection {
    privatestatic Connection conn;

    public static void main(String[] args) {
        System.out.println("主線程開始執行");
        initConnection(); // 初始化數據庫連接
        System.out.println("執行數據查詢與處理");

        // 注冊關閉鉤子
        Runtime.getRuntime().addShutdownHook(new Thread(() -> closeConnection()));
        System.out.println("主線程結束執行");
    }

    private static void initConnection() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/school_info?useSSL=true&",
                "root", "root"
            );
            System.out.println("數據庫連接成功!");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    private static void closeConnection() {
        try {
            conn.close();
            System.out.println("數據庫連接已關閉!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

輸出結果:

主線程開始執行
數據庫連接成功!
執行數據查詢與處理
主線程結束執行
數據庫連接已關閉!

使用關閉鉤子的注意事項

  1. 強制終止進程(如kill -9)不會觸發鉤子線程。
  2. 避免耗時操作:鉤子線程中不要執行長時間任務,否則會延遲 JVM 退出。
  3. 禁止異常拋出:鉤子線程中的異常可能導致 JVM 無法正常退出。
  4. 注冊順序:按依賴關系注冊鉤子,先注冊簡單任務,后注冊復雜任務。
  5. 避免啟動新線程:在鉤子中啟動新線程可能導致 JVM 無法正常關閉。

開源框架中的關閉鉤子機制

1. Spring

在AbstractApplicationContext中,registerShutdownHook()方法注冊鉤子,用于關閉上下文:

public void registerShutdownHook() {
    if (this.shutdownHook == null) {
        this.shutdownHook = new Thread(() -> doClose());
        Runtime.getRuntime().addShutdownHook(this.shutdownHook);
    }
}

2. Tomcat

Tomcat 通過注冊鉤子確保服務關閉時釋放資源:

public void registerShutdownHook() {
    if (this.shutdownHook == null) {
        this.shutdownHook = new Thread(() -> {
            synchronized (startupShutdownMonitor) {
                doClose();
            }
        });
        Runtime.getRuntime().addShutdownHook(this.shutdownHook);
    }
}

關閉鉤子機制的原理

JVM 啟動時,主線程會創建一個關閉線程(Shutdown Thread),并將所有注冊的鉤子添加到其任務列表中。當 JVM 收到終止信號時:

  1. 停止所有用戶線程。
  2. 啟動關閉線程,按順序執行鉤子任務。
  3. 等待所有鉤子執行完畢或超時后退出。

鉤子的注冊與執行

  • 注冊:通過Runtime.getRuntime().addShutdownHook(Thread)將線程添加到ApplicationShutdownHooks的靜態列表中。
  • 執行:關閉線程按順序同步執行系統級鉤子,異步執行應用級鉤子,并等待所有線程完成。

關閉鉤子的觸發時機

  1. 主動調用:通過Runtime.exit()或System.exit()觸發。
  2. 信號捕獲:JVM 注冊信號處理器(如INT、TERM),捕獲kill命令發送的信號后觸發。

示例代碼(捕獲信號):

public class SignalHandlerTest implements SignalHandler {
    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> 
            System.out.println("關閉鉤子正在運行...")));

        SignalHandler handler = new SignalHandlerTest();
        Signal.handle(new Signal("INT"), handler);  // 捕獲 Ctrl+C
        Signal.handle(new Signal("TERM"), handler); // 捕獲 kill 命令

        while (true) {
            System.out.println("主線程運行中...");
            Thread.sleep(2000);
        }
    }

    @Override
    public void handle(Signal signal) {
        System.out.println("接收到信號:" + signal.getName() + "-" + signal.getNumber());
        System.exit(0);
    }
}

輸出示例:

主線程運行中...
主線程運行中...
^C接收到信號:INT-2
關閉鉤子正在運行...

信號處理與守護線程

  • 信號不可捕獲的情況:KILL(9)和QUIT(3)無法被捕獲。
  • 守護線程:JVM 在所有用戶線程結束后自動退出,守護線程(如 GC 線程)不會阻止 JVM 退出。

總結

Java 的關閉鉤子機制覆蓋了大部分退出場景,但以下情況例外:

  • 使用kill -9強制終止進程時,鉤子不會執行。
  • 信號處理需調用System.exit()確保進程退出。

通過合理使用關閉鉤子,可以實現資源釋放、服務優雅關閉等關鍵功能。

責任編輯:武曉燕 來源: 程序猿技術充電站
相關推薦

2021-03-28 09:17:18

JVM場景鉤子函數

2025-08-04 06:00:00

Java并發編程開發

2021-01-19 10:35:49

JVM場景函數

2017-12-19 10:03:44

JavaLinux代碼

2024-12-24 08:03:56

2022-06-28 08:01:26

hook狀態管理state

2022-04-11 08:17:07

JVMJava進程

2022-07-24 09:46:48

優雅停機代碼

2020-12-01 12:44:44

PythonHook鉤子函數

2021-04-20 08:00:31

Redisson關閉訂單支付系統

2025-01-13 06:00:00

Go語言gRPC

2023-12-20 10:04:45

線程池Java

2017-09-19 14:53:37

Java并發編程并發代碼設計

2009-04-09 17:22:23

Linuxshutdown系統

2025-03-20 06:48:55

性能優化JDK

2025-07-25 06:48:26

Java編程并發編程

2025-08-05 06:00:00

并發編程Java開發

2025-03-26 00:55:00

2011-12-29 13:31:15

Java

2025-06-18 08:10:00

Java并發編程開發
點贊
收藏

51CTO技術棧公眾號

91视频.com| 久久先锋资源| 亚洲成人av片| 男人亚洲天堂网| 懂色一区二区三区| 国产一区二区看久久| 欧美精品videos另类日本| 黑人巨大精品欧美| www.久久久.com| 婷婷丁香久久五月婷婷| 午夜一区二区三视频在线观看| 国产免费久久久| 免费欧美日韩| 欧美老妇交乱视频| 中文字幕在线看高清电影| 国产精一区二区| 在线影院国内精品| 日韩视频 中文字幕| 黄色片在线播放| 国产91精品精华液一区二区三区 | 久草网在线观看| 成人系列视频| 精品一区二区三区三区| 欧美色图校园春色| 99蜜月精品久久91| 欧美日韩在线视频首页| 成人高清dvd| 91在线看黄| 久久久综合激的五月天| 亚洲综合色av| 一二三区中文字幕| 三级欧美在线一区| 91国在线精品国内播放| 久久久久久久久久网站| 日韩成人精品一区| 亚洲欧美中文日韩在线| 中国极品少妇xxxx| 日韩视频在线直播| 91精品国产91久久久久久最新毛片| 国产深夜男女无套内射| 丰满的护士2在线观看高清| 亚洲丝袜制服诱惑| 中文字幕欧美日韩一区二区| 国产三级视频在线看| 97se亚洲国产综合自在线| 国产亚洲情侣一区二区无| 精品人妻一区二区三区四区不卡 | av网站在线播放| 久久品道一品道久久精品| 国产嫩草一区二区三区在线观看| av中文字幕观看| 国产乱子伦视频一区二区三区| 国产精品羞羞答答| 一区二区三区精| 免费在线观看不卡| 国产美女搞久久| 中文亚洲av片在线观看| 日韩高清中文字幕一区| 日韩免费在线播放| 最近国语视频在线观看免费播放| 天堂蜜桃一区二区三区| 国产成人亚洲综合青青| 日韩不卡在线播放| 日韩精品亚洲专区| 成人a级免费视频| 国产同性人妖ts口直男| 国产成人免费在线观看不卡| 91国产在线免费观看| 亚洲精品第五页| 91亚洲国产成人精品一区二三| 久久国产精品 国产精品| 免费资源在线观看| 国产精品蜜臀av| 亚洲五码在线观看视频| av电影在线免费| 狠狠做深爱婷婷久久综合一区| aa免费在线观看| 日韩成人精品一区二区三区| 欧美一区二区播放| 成人在线视频免费播放| 国产探花在线精品| 久久精品久久久久久国产 免费| 欧美性猛交xxxxx少妇| 亚洲日本视频| 国产精品久久久久福利| 国产女人18毛片水18精| 国产成人h网站| 免费不卡亚洲欧美| 天堂аⅴ在线地址8| 夜夜嗨av一区二区三区四季av| 国产3p露脸普通话对白| 欧美日韩国产网站| 日韩欧美在线观看一区二区三区| 国产精品麻豆入口| 成人久久久久| 久久久久久久久久久av| 一级黄色在线视频| 国产最新精品免费| 麻豆一区区三区四区产品精品蜜桃| 137大胆人体在线观看| 一区二区久久久| 一区二区在线播放视频| 伊人久久大香线蕉av超碰| 国产亚洲精品久久久久久牛牛 | 91tv官网精品成人亚洲| 26uuu国产精品视频| 91午夜交换视频| 91麻豆福利精品推荐| 干日本少妇视频| 伊人久久高清| 日韩电影免费在线观看中文字幕| 99国产精品无码| 老鸭窝毛片一区二区三区| 91最新在线免费观看| 免费国产在线视频| 亚洲大片免费看| 97超碰人人看| 日韩欧美中文| 欧美综合一区第一页| www国产一区| 国产精品久久久久四虎| av动漫在线观看| 成人性生交大片免费看96| 丝袜亚洲欧美日韩综合| 波多野结衣一二区| 91一区二区三区在线播放| 欧美a级黄色大片| 欧美激情福利| 在线播放日韩精品| 亚洲第一网站在线观看| aaa欧美日韩| 精品少妇在线视频| 亚洲精品高潮| 欧美久久久精品| 精品国产无码AV| 亚洲色图一区二区三区| 日韩精品视频一二三| 日韩成人激情| 国产欧美精品日韩精品| 中文字幕日本在线| 色哟哟亚洲精品| 国产ts在线播放| 久久激情中文| 美国av一区二区三区| 午夜欧美激情| 亚洲男人的天堂网站| 日产电影一区二区三区| 成人国产电影网| 国产精品入口芒果| 另类春色校园亚洲| 久久人人爽人人爽人人片av高清| 丰满熟女一区二区三区| 午夜国产精品一区| 无码人妻精品一区二区三区温州| 亚洲人人精品| 欧美精品v日韩精品v国产精品| 波多野结衣视频一区二区| 亚洲国产小视频| 国产成人无码一区二区三区在线 | 欧美二区三区的天堂| 精品伦精品一区二区三区视频密桃 | 久草热在线观看| 国产欧美精品区一区二区三区 | 久久久久久久激情| 国产欧美一区二区三区精品观看| 国产精品美女免费视频| 天堂аⅴ在线地址8| 欧美一区二区三区白人| 日本少妇bbwbbw精品| 91丝袜国产在线播放| 88av.com| 欧美fxxxxxx另类| 国产区欧美区日韩区| 综合久久2023| 日韩在线播放一区| 亚洲免费一级片| 色综合色狠狠天天综合色| 大吊一区二区三区| 国产成人三级在线观看| 日本午夜激情视频| 精品成av人一区二区三区| 国产精品精品久久久| 黄色免费在线看| 亚洲国产精品久久久久秋霞蜜臀 | 日本综合字幕| xxxx性欧美| 日本免费一区视频| 在线观看视频一区二区欧美日韩| 五月天免费网站| caoporn国产一区二区| 国产一级特黄a大片免费| 91精品蜜臀一区二区三区在线| 波多野结衣成人在线| 亚洲欧美韩国| 久久九九免费视频| 日韩有码电影| 欧美一级淫片007| 丰满少妇xoxoxo视频| 亚洲日穴在线视频| 四虎永久免费在线观看| 国产麻豆午夜三级精品| 国产一区亚洲二区三区| 国产精品va| 亚洲精品国产精品国自产观看| 99精品中文字幕在线不卡 | 日本精品免费在线观看| 久久精品亚洲欧美日韩精品中文字幕| 国产在线一区二区三区四区| 亚洲视频资源| 国产99久久精品一区二区| 日本片在线观看| 色香阁99久久精品久久久| 日本美女一级片| 日韩欧美国产一区二区在线播放| 精品不卡一区二区| 亚洲一二三四久久| 国产suv一区二区三区| 欧美激情在线观看视频免费| www.日本高清| 国产mv日韩mv欧美| 一级黄色片在线免费观看| 日韩极品在线观看| 欧美 激情 在线| 国产日韩精品视频一区二区三区| 人人妻人人澡人人爽精品欧美一区| 久久99久久人婷婷精品综合 | 欧美大片久久久| 免费人成黄页网站在线一区二区| av之家在线观看| 欧美激情aⅴ一区二区三区| 中文字幕人成一区| 久久一区91| 一区二区不卡在线观看| 欧美日韩久久精品| 日韩一区二区三区资源| 国产99久久| 欧美xxxx黑人又粗又长密月| 开心激情综合| 久久99精品国产一区二区三区| 一区视频网站| 国产精品嫩草在线观看| ccyy激情综合| 国产99在线免费| 精品嫩草影院| 久久久久久久久一区| 制服丝袜日韩| 欧美资源一区| 日韩国产一区| 在线免费观看成人网| 99久久.com| 亚洲av综合色区| 午夜精品av| a在线视频观看| 亚洲欧美春色| 激情内射人妻1区2区3区 | 性生交大片免费看l| 国产成人午夜精品5599| 国产免费一区二区三区最新6| 高潮精品一区videoshd| 天堂www中文在线资源| 91蜜桃免费观看视频| b站大片免费直播| 国产日产欧产精品推荐色 | 久久久久久久久久久久国产精品| 丁香天五香天堂综合| 在线黄色免费网站| 国产午夜精品一区二区三区嫩草| 亚洲一级片在线播放| 亚洲视频狠狠干| www.av麻豆| 欧美伊人久久久久久久久影院| 中文字幕网址在线| 日韩欧美在线影院| 亚洲色欧美另类| 在线成人一区二区| av观看在线| 91精品国产高清久久久久久91| 波多野结衣久久精品| 国产欧美 在线欧美| 波多野结衣一区二区三区免费视频| 国产伦精品一区二区三区| 久久av综合| 糖心vlog在线免费观看| 亚洲一区成人| 天堂中文av在线| 97久久精品人人做人人爽50路 | 日韩精品永久网址| 免费在线黄网站| 日本视频一区二区三区| 欧美人与性动交α欧美精品| 99国产精品99久久久久久| 日韩av片在线免费观看| 午夜影院久久久| 亚洲天堂男人网| 亚洲福利视频久久| 日本中文字幕伦在线观看| 亚州国产精品久久久| 91国内外精品自在线播放| 国产精品久久久久久免费观看| 欧美精品乱码| 99久久国产综合精品五月天喷水| 免费在线观看一区二区三区| 国产高清成人久久| 亚洲视频小说图片| 日韩电影在线观看一区二区| 91精品欧美久久久久久动漫| 黄色国产在线| 欧美激情一区二区三区高清视频| 校园春色亚洲色图| 国产精品视频一区二区三区经| 日韩av二区| 每日在线更新av| 成人综合在线观看| 国产精品成人69xxx免费视频| 色呦呦国产精品| 日日夜夜精品免费| 欧美成人免费全部| 日韩精品第二页| 日韩av在线一区二区三区| aa亚洲婷婷| 免费看黄色片的网站| 亚洲视频中文字幕| 91久久国语露脸精品国产高跟| 亚洲精品98久久久久久中文字幕| 成人国产免费电影| 国产欧美日韩免费看aⅴ视频| 神马午夜久久| 久久黄色片视频| 成人动漫一区二区在线| 久草网视频在线观看| 欧美一区二区三区四区高清| 欧美日韩在线资源| 国产欧美最新羞羞视频在线观看| 国产一区国产二区国产三区| 黄色免费观看视频网站 | 色www亚洲国产阿娇yao| 色94色欧美sute亚洲线路一ni| 天天插天天干天天操| 国模精品视频一区二区三区| 高清日韩中文字幕| 免费人成自慰网站| 国产1区2区3区精品美女| 国产亚洲自拍av| 亚洲精品在线观看网站| 欧美xxxx少妇| 国产一区二区视频在线免费观看 | 少妇高潮一区二区三区69| 欧美激情综合色| 国产一区二区三区不卡av| 国产精品久久久久久久久电影网| 国产精品77777竹菊影视小说| 人妻久久一区二区| 日韩欧美电影在线| 成人影音在线| 久久影院理伦片| 久久综合九色综合欧美狠狠| 国产黄色大片免费看| 欧美伦理视频网站| 性欧美video高清bbw| 国产精品亚洲不卡a| 国产精品毛片在线| www亚洲色图| 91精品视频网| www在线观看黄色| 日韩videos| 加勒比av一区二区| 久久丫精品久久丫| 精品视频久久久久久| 视频精品导航| 特级西西444| 久久一区二区三区四区| 伊人久久一区二区| 欧美精品videossex88| 精品中文一区| 久久久九九九热| 婷婷激情综合网| 蜜芽在线免费观看| 高清国语自产拍免费一区二区三区| av成人毛片| 国产三级精品三级观看| 亚洲国产精品大全| 欧美aaa大片视频一二区| 永久免费看av| 久久久亚洲高清| 91黄色在线视频| 91精品国产91久久| 97视频精品| 性色av蜜臀av色欲av| 这里只有精品视频在线观看| а√天堂中文资源在线bt| 色一情一乱一伦一区二区三区丨| 国产精品自拍三区| 欧美一区免费看| 欧美激情小视频| 成人羞羞网站| 黄色录像a级片| 51午夜精品国产| 欧美电影网址| www插插插无码免费视频网站| 国产亚洲一区二区三区四区|