激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - JVM鉤子函數(shù)的使用場景詳解

JVM鉤子函數(shù)的使用場景詳解

2021-11-29 11:59Acelin_H Java教程

當(dāng)jvm進(jìn)程退出的時(shí)候,或者受到了系統(tǒng)的中斷信號(hào),hook線程就會(huì)啟動(dòng),一個(gè)線程可以注入多個(gè)鉤,下面這篇文章主要給大家介紹了關(guān)于JVM鉤子函數(shù)使用的相關(guān)資料,需要的朋友可以參考下

 

一、問題引入

 

背景

在編寫一個(gè)需要持續(xù)在后臺(tái)運(yùn)行的程序的時(shí)候遇到了這樣的場景:我的程序在主函數(shù)中創(chuàng)建了一個(gè)線程池周期性地執(zhí)行任務(wù),我希望主線程和線程池都持續(xù)運(yùn)行,但如果收到外部的關(guān)閉信號(hào)時(shí),主線程和線程池也都能同時(shí)退出。想到的就是程序結(jié)束的時(shí)候需要有一個(gè)stop()方法去手動(dòng)關(guān)閉線程池,但是怎么控制這個(gè)stop()方法在我想要的時(shí)候調(diào)用,以什么形式去接收外部的關(guān)閉信號(hào)也成了需要考慮的問題。

 

原始思路

最開始的嘗試是我將程序的運(yùn)行和停止分別用"start"和"stop"兩種狀態(tài)表示,然后用一個(gè)狀態(tài)文件state去記錄當(dāng)前的狀態(tài)(程序啟動(dòng)時(shí)默認(rèn)是"start"),如果想要關(guān)閉這個(gè)正在運(yùn)行的程序,就去修改狀態(tài)文件state,將里面內(nèi)容變?yōu)?quot;stop"。同時(shí)在主函數(shù)中打開這個(gè)狀態(tài)文件,循環(huán)監(jiān)聽里面的內(nèi)容,如果發(fā)現(xiàn)變?yōu)?quot;stop",就去調(diào)用stop()方法執(zhí)行關(guān)閉邏輯。按照這個(gè)思路,我寫了一個(gè)簡單的程序在IDEA中測試了一下效果,發(fā)現(xiàn)是可行的。但是當(dāng)我將程序打包,在mac系統(tǒng)上運(yùn)行jar包進(jìn)行測試的時(shí)候,不知什么原因,程序總是讀到state文件剛打開時(shí)的內(nèi)容,不能檢測到state文件的變化,無法按我設(shè)想的方式進(jìn)行關(guān)閉。因此只能另想辦法。

無意間看見JVM鉤子函數(shù)的介紹,發(fā)現(xiàn)這可能正是我想要的,于是趕緊拿來試一試。

 

二、JVM鉤子使用場景

JVM關(guān)閉的情況如下圖所示分為三類,第一種是正常的關(guān)閉,第二種是異常關(guān)閉的情況,第三種是強(qiáng)制關(guān)閉的情況。

JVM鉤子函數(shù)的使用場景詳解

JVM鉤子函數(shù)對(duì)于前兩種方式都可以進(jìn)行優(yōu)雅的關(guān)閉,但是對(duì)最后一種強(qiáng)制關(guān)閉就不起作用了。

下面我會(huì)根據(jù)這三種JVM關(guān)閉過程進(jìn)行簡單演示。

 

正常關(guān)閉

代碼如下:

public class TestJVMHook {
    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(()->
                stop()
        ));
        start();
        System.out.println("===程序正常結(jié)束===");
    }
    public static void start() {
        System.out.println("===調(diào)用start()方法===");
    }

    public static void stop() {
        System.out.println("===調(diào)用stop()方法===");
    }
}

運(yùn)行結(jié)果:

===調(diào)用start()方法===
===程序正常結(jié)束===
===調(diào)用stop()方法===

可以看到,在鉤子函數(shù)中聲明了stop()方法,然后程序正常結(jié)束后會(huì)自動(dòng)調(diào)用鉤子函數(shù)。

 

異常關(guān)閉

異常關(guān)閉分為OOM和RuntimeException兩種情況,我用除數(shù)為0的運(yùn)行時(shí)異常來演示。

代碼如下:

public class TestJVMHook {
    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(()->
                stop()
        ));
        start();
        int res = 10/0;
        System.out.println("===程序結(jié)束===");
    }
    public static void start() {
        System.out.println("===調(diào)用start()方法===");
    }

    public static void stop() {
        System.out.println("===調(diào)用stop()方法===");
    }
}

運(yùn)行結(jié)果:

===調(diào)用start()方法===
===調(diào)用stop()方法===
Exception in thread "main" java.lang.ArithmeticException: / by zero
 at com.example.TestJVMHook.main(TestJVMHook.java:9)

可以看到執(zhí)行"10/0"時(shí)發(fā)生運(yùn)行時(shí)異常,并不會(huì)正常打印下一行語句,但仍然會(huì)自動(dòng)調(diào)用鉤子函數(shù)中stop()方法。

 

強(qiáng)制關(guān)閉

這里我們啟動(dòng)一個(gè)循環(huán)程序,然后手動(dòng)去關(guān)閉它。

代碼如下:

public class TestJVMHook {
    public static void main(String[] args) throws InterruptedException {
        Runtime.getRuntime().addShutdownHook(new Thread(()->
                stop()
        ));
        int count = 1;
        start();
        while(true){
            System.out.println("循環(huán)計(jì)數(shù)器"+(count++));
            Thread.sleep(5*1000);
        }
    }
    public static void start() {
        System.out.println("===調(diào)用start()方法===");
    }

    public static void stop() {
        System.out.println("===調(diào)用stop()方法===");
    }
}

啟動(dòng)后查看進(jìn)程id,然后通過"kill -9 <pid>"強(qiáng)制關(guān)閉:

JVM鉤子函數(shù)的使用場景詳解

運(yùn)行結(jié)果:

JVM鉤子函數(shù)的使用場景詳解

還是上面那段代碼,再次啟動(dòng),采用"kill <pid>"關(guān)閉:

JVM鉤子函數(shù)的使用場景詳解

發(fā)現(xiàn)通過"kill "正常關(guān)閉可以有效調(diào)用鉤子函數(shù),但是"kill -9 "強(qiáng)制關(guān)閉則不會(huì)調(diào)用鉤子函數(shù)。

 

三、回歸問題

經(jīng)過一系列測試,驗(yàn)證了JVM鉤子函數(shù)確實(shí)可以實(shí)現(xiàn)我想要的資源關(guān)閉效果。由于我的程序是一個(gè)循環(huán)程序,需要手動(dòng)關(guān)閉,因此可以在關(guān)閉程序的腳本中通過kill pid的方式進(jìn)行鉤子函數(shù)的調(diào)用。

到此這篇關(guān)于JVM鉤子函數(shù)使用場景的文章就介紹到這了,更多相關(guān)JVM鉤子函數(shù)使用內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/acelin/p/15170821.html

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒有升過級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
主站蜘蛛池模板: 成人免费福利视频 | 午夜精品久久久久久久爽 | 九九热在线免费观看视频 | 日韩黄a | 在线免费小视频 | 青青草免费观看完整版高清 | 一级做a爰片性色毛片2021 | 久久久www成人免费精品 | 久久看免费视频 | 斗罗破苍穹在线观看免费完整观看 | 九九热在线视频观看 | 黄色a级片免费观看 | 国产99精品在线 | 国产精品久久久久久婷婷天堂 | 成人黄色免费 | 日韩精品久久久久久久电影99爱 | 免费视频一区 | 欧美jizzhd极品欧美 | 精精国产xxxx视频在线播放7 | 日韩av电影在线观看 | 亚洲午夜久久久久 | 久久亚洲精品久久国产一区二区 | 牛牛a级毛片在线播放 | 懂色粉嫩av久婷啪 | 国产欧美日本 | 国产va在线观看 | 欧美爱爱视频网站 | 嫩草91在线 | 天天干天天透 | 一本一本久久a久久精品综合小说 | www.成人免费视频 | 欧美黄色一级带 | 91av99| 久草在线网址 | 成人亚洲 | 久久久一区二区三区精品 | 日日噜噜夜夜爽 | 欧美一级xxx | 九九视频精品在线 | 久草热久草视频 | 五月天堂av91久久久 |