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

聊一下ShutdownHook原理

開發 后端
在java中我們可以寫出如下代碼來捕獲kill信號,只需要實現SignalHandler接口以及handle方法,程序入口處注冊要監聽的信號即可,當然不是每個信號都能捕獲處理。

[[394735]]

ShutdownHook介紹

在java程序中,很容易在進程結束時添加一個鉤子,即ShutdownHook。通常在程序啟動時加入以下代碼即可

  1. Runtime.getRuntime().addShutdownHook(new Thread(){ 
  2.     @Override 
  3.     public void run() { 
  4.         System.out.println("I'm shutdown hook..."); 
  5.     } 
  6. }); 

有了ShutdownHook我們可以

  • 在進程結束時做一些善后工作,例如釋放占用的資源,保存程序狀態等
  • 為優雅(平滑)發布提供手段,在程序關閉前摘除流量

不少java中間件或框架都使用了ShutdownHook的能力,如dubbo、spring等。

spring在application context被load時會注冊一個ShutdownHook。這個ShutdownHook會在進程退出前執行銷毀bean,發出ContextClosedEvent等動作。而dubbo在spring框架下正是監聽了ContextClosedEvent,調用dubboBootstrap.stop()來實現清理現場和dubbo的優雅發布,spring的事件機制默認是同步的,所以能在publish事件時等待所有監聽者執行完畢。

ShutdownHook原理

ShutdownHook的數據結構與執行順序

  • 當我們添加一個ShutdownHook時,會調用ApplicationShutdownHooks.add(hook),往ApplicationShutdownHooks類下的靜態變量private static IdentityHashMap
  • ApplicationShutdownHooks類初始化時會把hooks添加到Shutdown的hooks中去,而Shutdown的hooks是系統級的ShutdownHook,并且系統級的ShutdownHook由一個數組構成,只能添加10個
  • 系統級的ShutdownHook調用了thread類的run方法,所以系統級的ShutdownHook是同步有序執行的
  1. private static void runHooks() { 
  2.     for (int i=0; i < MAX_SYSTEM_HOOKS; i++) { 
  3.         try { 
  4.             Runnable hook; 
  5.             synchronized (lock) { 
  6.                 // acquire the lock to make sure the hook registered during 
  7.                 // shutdown is visible here. 
  8.                 currentRunningHook = i; 
  9.                 hook = hooks[i]; 
  10.             } 
  11.             if (hook != null) hook.run(); 
  12.         } catch(Throwable t) { 
  13.             if (t instanceof ThreadDeath) { 
  14.                 ThreadDeath td = (ThreadDeath)t; 
  15.                 throw td; 
  16.             } 
  17.         } 
  18.     } 
  • 系統級的ShutdownHook的add方法是包可見,即我們不能直接調用它
  • ApplicationShutdownHooks位于下標1處,且應用級的hooks,執行時調用的是thread類的start方法,所以應用級的ShutdownHook是異步執行的,但會等所有hook執行完畢才會退出。
  1. static void runHooks() { 
  2.     Collection<Thread> threads; 
  3.     synchronized(ApplicationShutdownHooks.class) { 
  4.         threads = hooks.keySet(); 
  5.         hooks = null
  6.     } 
  7.  
  8.     for (Thread hook : threads) { 
  9.         hook.start(); 
  10.     } 
  11.     for (Thread hook : threads) { 
  12.         while (true) { 
  13.             try { 
  14.                 hook.join(); 
  15.                 break; 
  16.             } catch (InterruptedException ignored) { 
  17.             } 
  18.         } 
  19.     } 

用一副圖總結如下:

ShutdownHook觸發點

從Shutdown的runHooks順藤摸瓜,我們得出以下兩個調用路徑

重點看Shutdown.exit 和 Shutdown.shutdown

Shutdown.exit

跟進Shutdown.exit的調用方,發現有 Runtime.exit 和 Terminator.setup

  • Runtime.exit 是代碼中主動結束進程的接口
  • Terminator.setup 被 initializeSystemClass 調用,當第一個線程被初始化的時候被觸發,觸發后注冊一個信號監聽函數,捕獲kill發出的信號,調用Shutdown.exit結束進程

這樣覆蓋了代碼中主動結束進程和被kill殺死進程的場景。

主動結束進程不必介紹,這里說一下信號捕獲。在java中我們可以寫出如下代碼來捕獲kill信號,只需要實現SignalHandler接口以及handle方法,程序入口處注冊要監聽的信號即可,當然不是每個信號都能捕獲處理。

  1. public class SignalHandlerTest implements SignalHandler { 
  2.  
  3.     public static void main(String[] args) { 
  4.  
  5.         Runtime.getRuntime().addShutdownHook(new Thread() { 
  6.             @Override 
  7.             public void run() { 
  8.                 System.out.println("I'm shutdown hook "); 
  9.             } 
  10.         }); 
  11.  
  12.         SignalHandler sh = new SignalHandlerTest(); 
  13.         Signal.handle(new Signal("HUP"), sh); 
  14.         Signal.handle(new Signal("INT"), sh); 
  15.         //Signal.handle(new Signal("QUIT"), sh);// 該信號不能捕獲 
  16.         Signal.handle(new Signal("ABRT"), sh); 
  17.         //Signal.handle(new Signal("KILL"), sh);// 該信號不能捕獲 
  18.         Signal.handle(new Signal("ALRM"), sh); 
  19.         Signal.handle(new Signal("TERM"), sh); 
  20.  
  21.         while (true) { 
  22.             System.out.println("main running"); 
  23.             try { 
  24.                 Thread.sleep(2000L); 
  25.             } catch (InterruptedException e) { 
  26.                 e.printStackTrace(); 
  27.             } 
  28.         } 
  29.     } 
  30.  
  31.     @Override 
  32.     public void handle(Signal signal) { 
  33.         System.out.println("receive signal " + signal.getName() + "-" + signal.getNumber()); 
  34.         System.exit(0); 
  35.     } 

要注意的是,通常來說我們捕獲信號,做了一些個性化的處理后需要主動調用System.exit,否則進程就不會退出了,這時只能使用kill -9來強制殺死進程了。

而且每次信號的捕獲是在不同的線程中,所以他們之間的執行是異步的。

Shutdown.shutdown

這個方法可以看注釋

  1. /* Invoked by the JNI DestroyJavaVM procedure when the last non-daemon 
  2.   * thread has finished.  Unlike the exit method, this method does not 
  3.   * actually halt the VM. 
  4.   */ 

翻譯一下就是該方法會在最后一個非daemon線程(非守護線程)結束時被JNI的DestroyJavaVM方法調用。

java中有兩類線程,用戶線程和守護線程,守護線程是服務于用戶線程,如GC線程,JVM判斷是否結束的標志就是是否還有用戶線程在工作。當最后一個用戶線程結束時,就會調用 Shutdown.shutdown。這是JVM這類虛擬機語言特有的"權利",倘若是golang這類編譯成可執行的二進制文件時,當全部用戶線程結束時是不會執行ShutdownHook的。

舉個例子,當java進程正常退出時,沒有在代碼中主動結束進程,也沒有kill,就像這樣

  1. public static void main(String[] args) { 
  2.  
  3.     Runtime.getRuntime().addShutdownHook(new Thread() { 
  4.         @Override 
  5.         public void run() { 
  6.             System.out.println("I'm shutdown hook "); 
  7.         } 
  8.     }); 

當main線程運行完了后,也能打印出I'm shutdown hook,反觀golang就做不到這一點

通過如上兩個調用的分析,我們概括出如下結論:

我們能看出java的ShutdownHook其實覆蓋的非常全面了,只有一處無法覆蓋,即當我們殺死進程時使用了kill -9時,由于程序無法捕獲處理,進程被直接殺死,所以無法執行ShutdownHook。

總結

綜上,我們得出一些結論

  • 重寫捕獲信號需要注意主動退出進程,否則進程可能永遠不會退出,捕獲信號的執行是異步的
  • 用戶級的ShutdownHook是綁定在系統級的ShutdownHook之上,且用戶級是異步執行,系統級是同步順序執行,用戶級處于系統級執行順序的第二位
  • ShutdownHook 覆蓋的面比較廣,不論是手動調用接口退出進程,還是捕獲信號退出進程,抑或是用戶線程執行完畢退出,都會執行ShutdownHook,唯一不會執行的就是kill -9

 

責任編輯:武曉燕 來源: 捉蟲大師
相關推薦

2025-01-10 11:07:28

2021-04-27 07:52:18

SQLNULLOR

2021-06-30 00:19:43

AOP動態代理

2022-02-08 08:31:52

const關鍵字C語言

2021-04-21 21:06:11

數據結構

2021-05-31 06:28:35

AutoMapper對象映射器

2021-03-10 00:02:01

Redis

2021-03-26 00:20:34

NFT區塊鏈數據庫

2021-08-07 07:56:59

Node邏輯對象

2019-01-31 07:16:06

2020-01-17 09:07:14

分布式系統網絡

2021-06-06 12:59:14

實現方式計數

2023-02-07 06:42:24

Pulsar負載均衡

2024-04-26 08:41:04

ViteHMR項目

2020-09-29 09:41:50

Spring Boot項目代碼

2023-02-09 08:48:47

Java虛擬機

2024-09-12 10:06:21

2021-01-26 05:06:24

LinuxXargs 命令

2024-05-29 11:24:27

2015-06-16 13:04:35

C#開發者JAVA 開發者
點贊
收藏

51CTO技術棧公眾號

手机免费观看av| 免费涩涩18网站入口| 狠狠躁夜夜躁av无码中文幕| 亚洲一区激情| 在线电影欧美日韩一区二区私密| 欧美又黄又嫩大片a级| 国产丝袜在线播放| 国产欧美一区二区三区网站| 亚洲一区二区三区四区在线播放| 成年人免费看毛片| 91tv精品福利国产在线观看| 精品无人区乱码1区2区3区在线| 狠狠操狠狠干视频| 中文字幕在线直播| 亚洲一区二区三区四区的| 日韩中文一区二区三区| 色婷婷av一区二区三区之红樱桃 | 一片黄亚洲嫩模| 热re99久久精品国产99热| 国产成年妇视频| 日韩av午夜在线观看| 性欧美xxxx| 青青操视频在线播放| 国产亚洲欧美日韩在线观看一区二区 | 欧美捆绑视频| 成人小视频免费观看| 国产精品自拍视频| www.久久久久久久| 亚洲精品国产日韩| 久久精品视频免费播放| 九九热免费在线| 蜜桃成人av| 日韩国产高清污视频在线观看| 色哟哟免费视频| 国产成人午夜性a一级毛片| 欧美日韩国产专区| 欧美日韩福利在线| 永久免费网站在线| 亚洲色图一区二区三区| 亚洲激情一区二区| 91在线品视觉盛宴免费| 国产欧美精品国产国产专区| 蜜桃臀一区二区三区| 日批免费在线观看| 国产成人精品亚洲日本在线桃色 | 能在线观看的av| 123区在线| 亚洲成人高清在线| 岛国大片在线播放| av在线不卡免费| 亚洲成人一区在线| 草草视频在线免费观看| av影片在线| 黄色一区二区三区| 99re在线视频免费观看| 亚洲天堂电影| 一本色道久久综合亚洲精品按摩| 日韩激情免费视频| 色吧亚洲日本| 色嗨嗨av一区二区三区| 久久精品午夜福利| 欧美男女视频| 欧美一级夜夜爽| 国产一精品一aⅴ一免费| 成人福利一区| 精品视频在线播放免| 99久久人妻无码精品系列| 欧美人妖在线| 色吧影院999| 国产免费一区二区三区四区| 亚洲在线久久| 午夜伦理精品一区| 国产一区二区视频网站| 另类小说一区二区三区| 91久久精品久久国产性色也91| 精品国产九九九| 99re这里只有精品首页| 欧美一区二区高清在线观看| 香港伦理在线| 亚洲二区视频在线| 欧美精品第三页| 亚洲天堂网站| 亚洲二区在线播放视频| 欧洲女同同性吃奶| 91精品99| 亲爱的老师9免费观看全集电视剧| 波多野结衣小视频| 国产精品亚洲综合一区在线观看| 国产欧美一区二区在线播放| 国产小视频在线| **欧美大码日韩| 国产96在线 | 亚洲| 欧洲一级精品| 亚洲的天堂在线中文字幕| 熟女少妇一区二区三区| 亚洲澳门在线| 欧美在线亚洲在线| 国产ts人妖调教重口男| 久久久久久影视| 日本a在线天堂| 日本在线视频一区二区| 337p日本欧洲亚洲大胆色噜噜| 一区二区伦理片| 伊人久久久大香线蕉综合直播| 国产精品视频一区国模私拍| 欧美视频一二区| 亚洲欧洲一区二区在线播放| 日韩少妇内射免费播放| 中文字幕亚洲在线观看| 一区二区欧美激情| 日韩 欧美 精品| 国内精品久久久久影院色| 国严精品久久久久久亚洲影视| 91美女视频在线| 欧美日韩视频免费播放| 美女被艹视频网站| 色狮一区二区三区四区视频| 51久久精品夜色国产麻豆| 国产高清免费av| 国产精品国产三级国产aⅴ入口| 国产中文字幕在线免费观看| 视频国产精品| 久久中文字幕视频| 中文字幕日产av| 久久九九久久九九| 欧美色图另类小说| 国产福利资源一区| 色综合久综合久久综合久鬼88| 亚洲影院一区二区三区| 国产亚洲成年网址在线观看| 亚洲熟妇av日韩熟妇在线| 亚洲一区 二区| 欧美成人免费全部| 国产美女永久免费| 中文字幕人成不卡一区| 污片在线免费看| 欧美亚洲国产一区| 国产精品第1页| 国产午夜精品一区理论片| 精品久久香蕉国产线看观看gif| 国产chinese中国hdxxxx| 欧美日韩日本国产亚洲在线 | 亚洲情趣在线观看| 不卡中文字幕在线观看| 日韩精品欧美激情一区二区| 国产精品成人av性教育| 国产粉嫩一区二区三区在线观看 | 久久av综合| 日韩免费观看高清| 黄色在线免费观看大全| 91福利在线观看| 少妇一级黄色片| 久久国内精品自在自线400部| 亚洲欧美日本国产有色| 久久人体av| 欧美成人国产va精品日本一级| 国产精品特级毛片一区二区三区| 综合中文字幕亚洲| 野花视频免费在线观看| 国产精品观看| 久久99国产精品99久久| 久久爱91午夜羞羞| 在线播放国产精品| 一级片在线免费观看视频| 亚洲人成亚洲人成在线观看图片| 精品国产免费久久久久久婷婷| 精品电影一区| 欧美影视一区二区| 欧美天堂一区| 欧美激情videoshd| 日本a一级在线免费播放| 日本韩国视频一区二区| 美女网站视频色| 国产不卡高清在线观看视频| www在线观看免费| 国产欧美一区| 91视频99| 在线观看精品| 欧美裸体男粗大视频在线观看| 国模无码一区二区三区| 日韩欧美在线一区| 国产天堂av在线| 99re热这里只有精品视频| 一区二区三区 日韩| 亚洲视频一区| 亚洲精品一区二区三区四区五区| 久久av网站| 日韩免费高清在线观看| 1stkiss在线漫画| 亚洲女人天堂av| 国产99久一区二区三区a片 | 伊人免费在线观看| 亚州成人在线电影| 无码人中文字幕| av不卡一区二区三区| 婷婷丁香激情网| 欧美天堂亚洲电影院在线观看 | 国产欧美91| 欧美一级免费在线观看| 亚洲免费专区| 高清视频一区二区三区| 99久久婷婷国产综合精品首页| 欧美激情乱人伦| 色的视频在线免费看| 亚洲精品美女在线观看| 99国产精品99| 在线观看日韩国产| 成人毛片18女人毛片| 亚洲男同1069视频| 老司机福利在线观看| 93久久精品日日躁夜夜躁欧美| 天天摸天天舔天天操| 石原莉奈在线亚洲二区| 精品久久一二三| 欧美日韩亚洲三区| 日韩不卡一二区| 99国产**精品****| 日韩欧美电影一区二区| 欧美激情极品| 国产精品视频入口| 久久久精品区| 成人www视频在线观看| 国产麻豆久久| 亲子乱一区二区三区电影| av白虎一区| 久久久久亚洲精品| 手机av在线播放| 欧美成人精品在线播放| 大片免费在线观看| 精品国偷自产在线视频99| www.av在线播放| 亚洲欧美在线播放| 欧洲成人av| 日韩激情av在线免费观看| 欧美亚洲精品在线观看| 日韩免费在线观看| www男人的天堂| 日韩欧美123| 精品国产一级片| 日韩欧美综合一区| www.久久伊人| 精品免费视频一区二区| 午夜久久久久久噜噜噜噜| 欧美一区二区三区在线看| 国产婷婷在线视频| 日韩午夜在线播放| 精品国产乱码久久久久久蜜臀网站| 制服丝袜av成人在线看| 国产精品熟女久久久久久| 69av一区二区三区| 国产乱码久久久久| 日韩一级片网址| 亚洲第一成年人网站| 精品久久久久久亚洲综合网| 肥臀熟女一区二区三区| 日韩电影第一页| 黄色在线网站| www.亚洲一区| 最新国产在线拍揄自揄视频| 欧美激情欧美狂野欧美精品| xxxx视频在线| 日本亚洲欧洲色| 成人在线不卡| 91在线观看免费高清完整版在线观看| 欧美经典一区| 国产日韩一区欧美| 蜜臀91精品国产高清在线观看| 亚洲成人自拍视频| 欧美高清日韩| 国产乱子伦农村叉叉叉| 丝袜诱惑亚洲看片| www.51色.com| 91在线视频观看| 少妇愉情理伦三级| 亚洲黄色小说网站| 久久久久99精品成人片我成大片| 在线免费视频一区二区| 国产精品无码AV| 亚洲精品美女久久久| 日本高清中文字幕在线| 久久久久久久久久久人体 | 激情欧美日韩一区| 999精品网站| 国产美女视频91| 大又大又粗又硬又爽少妇毛片| 国产精品久久久一区麻豆最新章节| 欧美成人aaa片一区国产精品| 欧美午夜激情小视频| 91亚洲精品国偷拍自产在线观看| 精品不卡在线视频| 91社区在线高清| 91极品女神在线| 在线不卡一区| 免费国产一区二区| 亚洲成人一区| 久久九九国产视频| 成人蜜臀av电影| 黄色一级大片在线免费观看| 精品久久久在线观看| 国产三级在线观看视频| 亚洲欧美另类在线观看| 蜜臀av在线| 国产这里只有精品| 嫩草影视亚洲| 久操网在线观看| 国产自产2019最新不卡| av网站免费在线看| 香蕉成人伊视频在线观看| 一本大道伊人av久久综合| 精品小视频在线| 超碰中文在线| 亚洲影院色在线观看免费| 成人看的视频| 欧美视频第一区| 成人激情午夜影院| 99精品久久久久| 在线播放91灌醉迷j高跟美女| 久久这里精品| 2021国产精品视频| 国内精品麻豆美女在线播放视频 | 亚洲第一视频网站| 伊人春色在线观看| 成人性生交大片免费看视频直播 | 久热99视频在线观看| 成人h在线观看| 日本视频一区在线观看| 亚洲一区二区网站| 极品白嫩丰满美女无套| 亚洲国产成人porn| 丰满少妇一级片| 欧美疯狂做受xxxx高潮| 麻豆视频久久| 日本xxx免费| 国产精品一区三区| 亚洲欧美小视频| 欧美一级片在线观看| 国产在线二区| 91在线观看免费观看| 亚洲深深色噜噜狠狠爱网站| 亚洲一区二区福利视频| 国产精品黄色在线观看| 在线视频 中文字幕| 日韩在线国产精品| 日韩福利影视| 樱花www成人免费视频| 精品午夜一区二区三区在线观看| www.xx日本| 欧美一级夜夜爽| 欧美6一10sex性hd| 国产偷久久久精品专区| 99精品国产在热久久婷婷| 日韩aaaaa| 色综合色狠狠天天综合色| 黄色在线观看网| 91精品久久久久久久久| 偷拍欧美精品| 久久久久国产免费| 午夜精品久久久| 嫩草在线播放| 国产日韩欧美在线播放| 中文字幕一区二区av| 麻豆tv在线观看| 欧美日韩一区二区免费视频| 黄色的视频在线免费观看| 国产精品久久久久久久美男| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 国产第一区电影| 欧美r级电影| 野花视频免费在线观看| 欧美午夜www高清视频| 日本暖暖在线视频| 国产一区二区三区四区五区加勒比| 午夜亚洲影视| 欧美日韩国产一二三区| 日韩欧美电影在线| 韩漫成人漫画| 中国老女人av| 久久精品亚洲乱码伦伦中文| 99精品视频免费看| 欧美亚洲国产日韩2020| 99久久久久国产精品| 国产 xxxx| 欧美高清精品3d| 热三久草你在线| 国产福利片一区二区| av一区二区三区四区| 在线观看免费视频一区| 久久久久这里只有精品| 色婷婷亚洲mv天堂mv在影片| www男人天堂| 欧美三级电影精品| 超碰资源在线| 中文字幕在线中文字幕日亚韩一区| 成人18视频在线播放| 中文字幕av影视| 国产91精品久久久久久久| 中文字幕午夜精品一区二区三区| 亚洲精品乱码久久久久久不卡| 91精品国产综合久久久蜜臀图片| 女人让男人操自己视频在线观看|