精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

韩国v欧美v日本v亚洲| 欧美成人video| 中文字幕日韩精品久久| 国产丰满美女做爰| 亚洲综合社区| 国产一区二区动漫| 亚洲一区二区图片| 色偷偷色偷偷色偷偷在线视频| 久久久久久综合| 91久久久久久久久| 久久久久久久久久久久久av| 色琪琪久久se色| 精品精品国产高清a毛片牛牛| www.com毛片| 黄色片免费在线观看| k8久久久一区二区三区| 国产日韩专区在线| 日韩乱码一区二区| 午夜精品毛片| 亚洲欧美视频在线| 天堂va欧美va亚洲va老司机| 日本成人伦理电影| 午夜精品一区二区三区三上悠亚| 色播亚洲婷婷| 香蕉久久国产av一区二区| 国产综合色精品一区二区三区| 韩国国内大量揄拍精品视频| 国产喷水在线观看| 自拍偷拍一区| 亚洲国产婷婷香蕉久久久久久 | 三级影片在线观看| 亚洲国产网址| 亚洲国产精品久久久久秋霞蜜臀 | 中文字幕在线看视频国产欧美在线看完整 | 亚洲激情啪啪| 精品电影在线| 91香蕉视频污| 国产一区二区久久久| 国产精品女同一区二区| 日本美女一区二区三区视频| 77777亚洲午夜久久多人| 麻豆疯狂做受xxxx高潮视频| 亚洲精品国产成人影院| 日韩在线欧美在线| 伊人影院综合网| 国产毛片一区二区三区| 日韩电影中文字幕在线| 一级片免费在线观看视频| 亚洲91在线| 欧美精品久久一区| 欧美一级视频在线| 亚洲欧洲一二区| 欧美人妇做爰xxxⅹ性高电影| 日本888xxxx| 日韩av超清在线观看| 色婷婷综合久色| 日韩a在线播放| 成人免费看黄| 在线影院国内精品| 天天爽夜夜爽一区二区三区| 2019年精品视频自拍| 色噜噜狠狠色综合欧洲selulu| 亚洲人成色77777| 欧美gay视频| 欧美性猛交xxxxxx富婆| 国产一二三区av| 香蕉久久一区| 精品欧美黑人一区二区三区| 婷婷五月精品中文字幕| 偷窥自拍亚洲色图精选| 亚洲欧美在线x视频| 亚洲欧洲久久久| 色婷婷亚洲mv天堂mv在影片| 久久综合88中文色鬼| 欧美激情一区二区视频| 亚洲国产免费看| 国产成人精品日本亚洲专区61| 懂色av蜜臀av粉嫩av喷吹| 久久国产视频网| 999视频在线观看| 视频污在线观看| 国产亚洲欧美日韩在线一区| 亚洲人成影视在线观看| fc2ppv国产精品久久| 亚洲第一av色| 欧美一级裸体视频| 日本一区二区乱| 日韩激情av在线免费观看| 欧洲av一区二区三区| 婷婷亚洲五月| 97成人在线视频| 亚洲天堂999| 成人免费毛片aaaaa**| 欧美日韩精品不卡| 超碰porn在线| 色综合久久久久久久久久久| 久久综合在线观看| 日韩av不卡一区| 久久视频在线免费观看| 国产精品999在线观看| 蜜桃av一区二区| 国产一区二区三区黄| a天堂中文在线88| 亚洲一区二三区| 中文字幕永久视频| 久久97精品| 久久人人爽人人爽人人片亚洲| 日本午夜小视频| 麻豆91精品91久久久的内涵| 精品国产_亚洲人成在线| 毛片在线播放a| 欧美日韩中文字幕| 日本黄色大片在线观看| 欧美综合一区| 91精品国产高清自在线| av中文字幕免费在线观看| 久久精品夜色噜噜亚洲a∨| 国产成人一区二区三区别| 欧美日韩视频免费看| 亚洲精品一区久久久久久| 久久久久久久久久久久国产| 蜜臂av日日欢夜夜爽一区| 欧美日韩成人一区二区三区 | 免费观看毛片网站| 自拍偷拍国产精品| 欧美亚洲日本在线观看| 精品国产一区二区三区不卡蜜臂 | 国产一区视频在线看| 欧美日韩一区二区视频在线观看| 好看的中文字幕在线播放| 69精品人人人人| 美国美女黄色片| 久久久精品日韩| 另类小说综合网| 黄在线观看免费网站ktv| 精品久久一二三区| 欧美极品aaaaabbbbb| 狠狠网亚洲精品| 亚洲一区在线免费| 激情欧美一区二区三区黑长吊| 亚洲精品视频中文字幕| 国产99久久久| 久久亚洲欧美国产精品乐播 | 永久免费看黄网站| 精品一二三四区| 亚洲一区二区三区免费看| 亚洲成a人片| 亚洲天堂日韩电影| 黄色污污网站在线观看| 26uuu久久天堂性欧美| 国产一区二区网| 久久夜色精品国产噜噜av小说| 欧美国产第一页| 亚洲欧美另类日韩| 精品国产电影一区| 免费观看av网站| 久久精品人人做人人爽电影蜜月| 免费看成人片| 欧美极品免费| 色婷婷av一区二区三区在线观看| 这里只有精品999| 国产精品卡一卡二| aaaaaaaa毛片| 日韩一级免费| 欧美日韩精品免费观看| 日本美女久久| 欧美第一页在线| 日韩中文字幕免费观看| 色哟哟一区二区在线观看| 美女爆乳18禁www久久久久久| 久久久噜噜噜久久狠狠50岁| 日韩欧美亚洲日产国产| 国产精品亚洲欧美一级在线| 欧美激情视频一区二区| 三级国产在线观看| 欧美日韩一区在线观看| 日本a级片视频| 97se亚洲国产综合自在线| 日日碰狠狠丁香久燥| 欧美wwwww| av观看久久| 成人免费福利| 欧美成人三级视频网站| 午夜福利一区二区三区| 欧美色爱综合网| 精品无码久久久久久久久| 久久免费美女视频| www.欧美激情.com| 日韩一级精品| 国产精品99久久久久久大便| 久久97久久97精品免视看秋霞| 国产999精品久久久| 国产在线观看a视频| 亚洲精品国产免费| 一级久久久久久久| 欧美日韩在线另类| 91麻豆精品成人一区二区| 91丝袜美腿高跟国产极品老师| 日韩一级理论片| 亚洲成色精品| 中文字幕剧情在线观看一区| 天美av一区二区三区久久| 成人国产亚洲精品a区天堂华泰| hd国产人妖ts另类视频| 社区色欧美激情 | 污污网站在线免费观看| 91精品国产一区二区| 国产又大又黄又粗| 一区二区三区高清在线| 99精品全国免费观看| 99精品久久99久久久久| 在线视频日韩欧美| 美女免费视频一区二区| 成人在线免费观看av| 综合激情一区| 亚洲在线播放电影| 免费观看久久av| 国内精品**久久毛片app| 国产免费区一区二区三视频免费| 日韩美女在线播放| 91精品国产黑色瑜伽裤| 久久999免费视频| 午夜免费福利在线观看| 亚洲欧洲美洲在线综合| 天堂在线资源8| 精品人在线二区三区| av在线资源观看| 这里只有精品99re| 中文字幕在线观看第二页| 日韩欧美在线第一页| 四虎成人精品永久免费av| 亚洲婷婷国产精品电影人久久| 国产又粗又猛又爽又黄av| 91丨porny丨国产入口| 久久久老熟女一区二区三区91| 国产精品一区二区三区四区| 狠狠干狠狠操视频| 蜜桃视频一区二区三区在线观看| 国产极品美女高潮无套久久久| 99视频一区| 色综合久久久久无码专区| 亚洲福利电影| 国产美女在线一区| 在线精品福利| 老太脱裤让老头玩ⅹxxxx| 亚洲经典视频在线观看| 男人天堂手机在线视频| 亚洲久久视频| 日本a级片免费观看| 丝袜美腿亚洲色图| 亚欧在线免费观看| 免费观看日韩电影| 超碰在线播放91| 精品制服美女丁香| 欧美高清精品一区二区| 国产麻豆精品在线| 老女人性生活视频| 粉嫩久久99精品久久久久久夜 | 亚洲电影一区| 国产伦精品一区二区| 欧美色资源站| 日本在线免费观看一区| 三区四区不卡| 国产精品igao激情视频| 亚洲伦伦在线| 国产l精品国产亚洲区久久| 三级久久三级久久久| 色一情一区二区三区| 国产一区二区福利| 少妇精品无码一区二区三区| 久久久99久久| 777777国产7777777| 亚洲国产你懂的| 国产精品久免费的黄网站| 欧美亚洲综合一区| 国产麻豆一精品一男同| 亚洲第一偷拍网| 大地资源中文在线观看免费版| 久久精品视频中文字幕| av中文字幕在线观看第一页 | 国内精品视频一区二区三区| 久久这里只有| 国产精品中文久久久久久| 不卡电影一区二区三区| 日本人亚洲人jjzzjjz| 一区二区日韩av| 午夜一级黄色片| 精品卡一卡二卡三卡四在线| 国产一二在线观看| 欧美精品一本久久男人的天堂| 色在线中文字幕| 亚洲一区美女视频在线观看免费| 任你躁在线精品免费| 一区二区三区电影| 一区二区动漫| 在线观看av免费观看| 久久综合99re88久久爱| 夫妻性生活毛片| 色先锋aa成人| 人人妻人人澡人人爽人人欧美一区| 国产亚洲精品高潮| 成人性生交大片免费看在线播放| 国产精品久久久久久超碰| caoporn成人免费视频在线| 亚洲女人毛片| 午夜一级在线看亚洲| 日本黄色www| 国产精品美女久久久久久| 亚洲精品1区2区3区| 欧美一区二区成人6969| 国模精品一区二区| 韩国欧美亚洲国产| 亚洲精品18| 一本久久a久久精品vr综合 | 日本成人xxx| 国产精品网站在线观看| 免费黄色网址在线| 亚洲第一区中文字幕| 成人欧美在线| 国产精品自产拍在线观看| 欧美激情在线精品一区二区三区| 人人妻人人做人人爽| 国产福利视频一区二区三区| 国产aaaaaaaaa| 色综合久久88色综合天天免费| 黄色片一区二区三区| 欧美精品在线播放| 日韩三区四区| 亚洲精品在线免费看| 久久黄色网页| 亚洲最大成人网站| 欧美性猛交xxxx黑人| 手机看片1024国产| 久久久久久国产精品| 视频欧美一区| 神马午夜伦理影院| 国产美女av一区二区三区| 国产精品麻豆免费版现看视频| 日本久久一区二区三区| 欧美精品a∨在线观看不卡| 91av免费观看91av精品在线| 欧美大胆a级| 国产视频九色蝌蚪| 99久久精品免费精品国产| 在线观看 中文字幕| 亚洲国产福利在线| 国产免费拔擦拔擦8x高清在线人 | 日本午夜在线亚洲.国产| 亚洲欧洲美洲国产香蕉| 日韩视频在线免费看| 国产亚洲一二三区| 国产成人麻豆免费观看| 在线观看视频99| 欧美黄色a视频| 91社在线播放| 高清不卡一二三区| 国产无遮挡aaa片爽爽| 亚洲精品黄网在线观看| 自拍偷拍欧美视频| 日韩免费av电影| 韩国av一区二区三区在线观看| 国产黄色小视频网站| 欧美成人艳星乳罩| 黑森林国产精品av| 日韩av图片| 狠狠v欧美v日韩v亚洲ⅴ| 丰满少妇被猛烈进入一区二区| 日韩精品一区二区三区中文精品| 丁香花在线电影小说观看| 久久av一区二区三区亚洲| 久久在线91| 日日骚一区二区三区| 亚洲国产精品嫩草影院久久| 欧美电影h版| 日本美女爱爱视频| 91亚洲永久精品| 一级久久久久久久| 97高清免费视频| 日韩国产在线| 国产清纯白嫩初高中在线观看性色| 欧美日韩国产中文字幕| www在线播放| 国产精品久久久久久久久久久久午夜片| 国产精品久久久久毛片大屁完整版 | 136福利视频导航| 性日韩欧美在线视频| 欧美日韩第一| 激情av中文字幕| 欧美影片第一页| 91香蕉在线观看| 日本不卡一区| 国产精品一级二级三级| 少妇太紧太爽又黄又硬又爽| 精品久久久999| 日韩精选在线| 欧美老女人bb| 欧美性xxxxxx少妇| f2c人成在线观看免费视频| 亚洲一区二区三区精品在线观看| 99久久精品国产导航|