色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

java小知識-ShutdownHook(優(yōu)雅關閉)

京東云 ? 來源:京東物流 崔冬冬 ? 作者:京東物流 崔冬冬 ? 2024-12-19 10:36 ? 次閱讀

作者:京東物流 崔冬冬

一、先提出一個問題

我們如果在JVM退出的時候做一些事情,比如關閉遠程鏈接,怎么實現(xiàn)呢?

二、ShutdownHook簡介

java里有個方法Runtime.getRuntime#addShutdownHook,是否了解呢?

ShutdownHook是什么意思呢,看單詞解釋“關閉鉤子”,addShutdownHook就是添加一個關閉鉤子,這個鉤子是做什么的呢?能否解決上面的問題?

1、RunTime類

先看一下看源碼RunTime#addShutdownHook方法與解釋。

1.1 方法解釋

核心意思,在Java虛擬機在關閉時會觸發(fā)一些自己添加的事件。

Registers a new virtual-machine shutdown hook.
The Java virtual machine shuts down in response to two kinds of events:
The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or
The virtual machine is terminated in response to a user interrupt, such as typing ^C, or a system-wide event, such as user logoff or system shutdown.
A shutdown hook is simply an initialized but unstarted thread. When the virtual machine begins its shutdown sequence it will start all registered shutdown hooks in some unspecified order and let them run concurrently. 
When all the hooks have finished it will then halt. Note that daemon threads will continue to run during the shutdown sequence, as will non-daemon threads if shutdown was initiated by invoking the exit method.

1.2 方法源碼

  public void addShutdownHook(Thread hook) {
        @SuppressWarnings("removal")
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("shutdownHooks"));
        }
        ApplicationShutdownHooks.add(hook);
    }

方法內部調用了ApplicationShutdownHooks#add, 我們繼續(xù)往下看。

2、ApplicationShutdownHooks類

2.1 添加鉤子


     private static IdentityHashMap hooks;
     static synchronized void add(Thread hook) {
        if(hooks == null)
            throw new IllegalStateException("Shutdown in progress");
        if (hook.isAlive())
            throw new IllegalArgumentException("Hook already running");
        if (hooks.containsKey(hook))
            throw new IllegalArgumentException("Hook previously registered");
        hooks.put(hook, hook);
    }

我們添加了一個鉤子,這個鉤子是個線程,這個線程怎么執(zhí)行的呢? 繼續(xù)看一下此類中的runHooks。

2.2 執(zhí)行鉤子


static void runHooks() {
        Collection threads;
        synchronized(ApplicationShutdownHooks.class) {
            threads = hooks.keySet();
            hooks = null;
        }
        for (Thread hook : threads) {
            hook.start();
        }
        for (Thread hook : threads) {
            while (true) {
                try {
                    hook.join();
                    break;
                } catch (InterruptedException ignored) {
                }
            }
        }
    }

執(zhí)行runHooks的時候,會啟動所有的hook線程,什么時候調用runHooks方法的呢?

2.3 執(zhí)行時機

為什么在系統(tǒng)退出的時候會執(zhí)行添加的hook呢?我們看一下正常的退出操作System#exit方法。

1) 類調用層級

System->Runtime->Shutdown->ApplicationShutdownHooks

2) 方法調用

系統(tǒng)退出入口:System#exit

步驟 1-->System#exit

步驟 2-->Runtime#exit;

步驟 3--> Shutdown#exit

步驟 4--> Shutdown#runHooks

步驟 5--> ApplicationShutdownHooks#runHooks

步驟 6-->啟動添加的hook線程

3) 補充一下

為什么步驟4會調用到步驟5呢?

可以看一下ApplicationShutdownHooks的構造函數(shù),在創(chuàng)建的時候,封裝了runHooks方法,放到了Shutdown的鉤子集合里。

如此形成閉環(huán),在系統(tǒng)正常退出的時候,最終執(zhí)行我們添加的hook。

三、舉個例子

了解了基本原理,我們看一下怎么使用的

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("等等我");
            }
        };
        Runtime.getRuntime().addShutdownHook(thread);
        System.out.println("程序關閉"); 
   }
    輸出:
    程序關閉
    等等我

可以看到,在JVM退出的時候調用,執(zhí)行了此線程,我們開發(fā)中,哪些場景可以使用呢?

四、應用場景

關閉鏈接、線程、資源釋放、記錄執(zhí)行狀態(tài)等。

五、風險點

1、長時間等待

如果添加的hook線程長時間執(zhí)行,我們的退出命令會一直等待,為什么呢?

舉個例子,我們在執(zhí)行的時候sleep一下

  public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000*300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(new Date()+" 等我5分鐘");
            }
        };
        Runtime.getRuntime().addShutdownHook(thread);
        System.out.println(new Date()+" 程序關閉");
    }
輸出:
Tue Nov 12 17:37:38 CST 2024 程序關閉
Tue Nov 12 17:42:38 CST 2024 等我5分鐘

2、原因

JVM在退出的時候會調用runHooks方法,看一下上面的方法java.lang.ApplicationShutdownHooks#runHooks方法。

關鍵字 hook.join(); 主線程會等待子線程執(zhí)行完成。

如果程序一直執(zhí)行,不能退出怎么辦?

3、解決方案

1 ) 寫代碼時候控制執(zhí)行邏輯、時長

kill -9 命令 強制退出

六、擴展

1、Runtime.getRuntime#addShutdownHook是面向開發(fā)者

ApplicationShutdownHook#add、Shutdown#add我們都不能直接使用。

2、許多中間件框架也利用addShutdownHook來實現(xiàn)資源回收、清理等操作

比如Spring框架中,使用了ShutdownHook注冊,我們常用的@PreDestroy在Bean銷毀前執(zhí)行一些操作,也是借助其回調的。

七、總結

1、本文簡單介紹了一下ShutdownHook使用、原理、風險點。

2、我們工作中可以自己注冊ShutdownHook,主動釋放一些資源,降低風險。

3、小知識分享,不足之處歡迎大家指正,關于java里的知識點也歡迎大家討論分享。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2966

    瀏覽量

    104702
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12220
收藏 人收藏

    評論

    相關推薦

    Java 23功能介紹

    Java 23 包含全新和更新的 Java 語言功能、核心 API 以及 JVM,同時適合新的 Java 開發(fā)者和高級開發(fā)者。從?IntelliJ IDEA 2024.2?開始已支持 Java
    的頭像 發(fā)表于 12-04 10:02 ?193次閱讀
    <b class='flag-5'>Java</b> 23功能介紹

    java知識-納秒

    作者:京東物流 崔冬冬 一、System.nanoTime() java中,有這么一個方法 System.nanoTime() ,你用過嗎? 二、與System.currentTimeMillis
    的頭像 發(fā)表于 11-26 11:11 ?118次閱讀

    Java集合API的改進介紹

    解答這些問題。 我們將逐步學習 Java 集合類的優(yōu)化過程,并按版本逐一對比分析。主要討論的焦點將包括 JDK 1.0、1.2、1.4、1.5、1.6、1.8、9、10、11 和 21 版本的 Java 集合功能 Java 集合
    的頭像 發(fā)表于 11-22 11:12 ?175次閱讀
    <b class='flag-5'>Java</b>集合API的改進介紹

    基于Java的工具Power Stage Designer

    電子發(fā)燒友網站提供《基于Java的工具Power Stage Designer.pdf》資料免費下載
    發(fā)表于 11-14 16:01 ?2次下載
    基于<b class='flag-5'>Java</b>的工具Power Stage Designer

    Java中時間戳的使用

    Java中時間戳的使用
    的頭像 發(fā)表于 11-06 16:04 ?189次閱讀
    <b class='flag-5'>Java</b>中時間戳的使用

    C語言與Java語言的對比

    C語言和Java語言都是當前編程領域中的重要成員,它們各自具有獨特的優(yōu)勢和特點,適用于不同的應用場景。以下將從語法特性、內存管理、跨平臺性、性能、應用領域等多個方面對C語言和Java語言進行詳細對比。
    的頭像 發(fā)表于 10-29 17:31 ?315次閱讀

    java反編譯能拿到源碼嗎

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉換回Java源代碼的過程。雖然反編譯可以幫助理解代碼的邏輯和結構,但它并不總是能完美地還原原始源代碼。反編譯工具通常會產生與原始代碼
    的頭像 發(fā)表于 09-02 11:03 ?945次閱讀

    【轉型必看】Java到AI,程序員的逆襲秘籍,轉行人工智能不再是夢!

    人工智能,轉型的優(yōu)勢,薪資對比,以及轉型所需的知識和學習路線等。01Java開發(fā)者能否轉型人工智能?答案是肯定的。Java作為一種廣泛使用的編程語言,擁有強大的生
    的頭像 發(fā)表于 07-31 14:42 ?1038次閱讀
    【轉型必看】<b class='flag-5'>Java</b>到AI,程序員的逆襲秘籍,轉行人工智能不再是夢!

    華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

    Java Web和Java是兩個不同的概念,它們在功能、用途和實現(xiàn)方式上存在一些區(qū)別,下面將詳細介紹它們之間的區(qū)別。 1. 功能和用途: – Java是一種編程語言,它提供了一種用于開發(fā)各種應用程序
    的頭像 發(fā)表于 07-16 13:35 ?785次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別

    華為云開發(fā)者桌面全新發(fā)布 CodeArts IDE for Python,極致優(yōu)雅云原生開發(fā)體驗

    Python 編碼體驗。 Python 是一種編程語言,廣泛用于 Web 應用程序、軟件開發(fā)、數(shù)據科學和機器學習 (ML)。Python 以其優(yōu)雅的語法、動態(tài)解釋性、豐富的標準庫、極高的開發(fā)效率深受全球開發(fā)者
    的頭像 發(fā)表于 05-10 00:27 ?1234次閱讀
    華為云開發(fā)者桌面全新發(fā)布 CodeArts IDE for Python,極致<b class='flag-5'>優(yōu)雅</b>云原生開發(fā)體驗

    已經安裝了Java,且依然提示安裝Java是為什么?

    我已經在機器上安裝了最新版的 Java 10,打開 Cube 卻得到要求安裝 Java 1.7.0_45 的提示。何解?Eclipse CDT 依賴 Java,不可卸載重裝。
    發(fā)表于 04-26 06:23

    java實現(xiàn)多線程的幾種方式

    Java實現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執(zhí)行不同的任務或操作。Java中的多線程可以提高程序的效率和性能,使得程序可以同時處理多個任務。 Java提供
    的頭像 發(fā)表于 03-14 16:55 ?686次閱讀

    實用小知識:如何檢測油箱蓋是否關閉

    汽油箱和加注口周圍被認為是高度危險的易爆區(qū)域,存在引發(fā)火災的風險。車輛操作員或維修人員容易忘記關閉油箱蓋,而直接從油箱中偷盜汽油的現(xiàn)象也在增加。為了解決這些問題,設計師現(xiàn)在打算采用干簧傳感器。這種
    的頭像 發(fā)表于 02-26 11:25 ?1137次閱讀
    實用小<b class='flag-5'>知識</b>:如何檢測油箱蓋是否<b class='flag-5'>關閉</b>?

    優(yōu)雅停機是什么?SpringBoot+Nacos+k8s實現(xiàn)優(yōu)雅停機

    優(yōu)雅停機是什么?網上說的優(yōu)雅下線、無損下線,都是一個意思。
    的頭像 發(fā)表于 02-20 10:00 ?2027次閱讀
    <b class='flag-5'>優(yōu)雅</b>停機是什么?SpringBoot+Nacos+k8s實現(xiàn)<b class='flag-5'>優(yōu)雅</b>停機

    Oracle 2024年Java發(fā)展藍圖分析

    Oracle 的 Java 開發(fā)者布道師 Nicolai Parlog 于近日發(fā)布一段視頻,介紹了 2024 年的 Java 工作規(guī)劃。
    的頭像 發(fā)表于 01-26 14:27 ?1327次閱讀
    主站蜘蛛池模板: 国产亚洲精品久久久久久鸭绿欲| 99在线视频免费观看视频| 亚洲一卡二卡三卡四卡无卡麻豆 | 人妻夜夜爽天天爽三区麻豆AV网站| 欧美精品中文字幕亚洲专区| 日本人xxxⅹ18hd19hd| 同桌上课把奶露出来给我玩| 亚洲高清在线视频| 一本道本线中文无码| 97亚洲狠狠色综合久久久久| 东北小伙FREECHINESE野外| 国产精品日本不卡一区二区| 精品一成人岛国片在线观看| 麻豆成人AV久久无码精品| 欧美亚洲另类图片| 小女生RAPPER入口| 中文字幕午夜福利片| 扒开老师大腿猛进AAA片邪恶| 国产精品人妻午夜福利| 久久re这里视频精品15| 欧美亚洲韩日午夜| 羞羞漫画免费漫画页面在线看漫画秋蝉| 在线不卡日本v二区| qvod电影| 国内久经典AAAAA片| 女人被躁到高潮嗷嗷叫小| 无码人妻精品一区二区蜜桃在线看 | 青草影院内射中出高潮-百度| 色婷婷国产精品视频一区二区三区 | 近亲乱中文字幕| 男女无遮挡吃奶gift动态图| 神马伦理2019影院不卡片| 一级片mp4| 嘟嘟嘟在线视频免费观看高清中文| 好男人好资源在线观看免费视频| 免费看国产曰批40分钟| 午夜啪啪免费视频| 99国产精品久久人妻无码| 国产成人mv 在线播放| 狼群资源网中文字幕| 为什么丈夫插我我却喜欢被打着插|