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

a'aaa级片在线观看| 国产女人18毛片18精品| 国产探花一区| 欧美视频在线一区二区三区 | 国产精品一区二区免费看| 国产精品视频一区二区三| 岛国成人av| 欧美主播一区二区三区美女| 在线视频不卡国产| 五月婷婷六月丁香| 激情久久五月天| 91精品国产91久久久久| 美国黄色特级片| 国产劲爆久久| 欧美美女黄视频| 欧美网站免费观看| a级影片在线| 久久久久综合网| 亚洲最大激情中文字幕| 国产亚洲欧美在线精品| 午夜日韩av| 国产一区二区三区久久精品| 在线播放第一页| 国产黄色一区| 精品毛片三在线观看| 日韩video| 高清av在线| 99久久国产综合色|国产精品| 国产精品中文字幕在线观看| 青青青国产在线| 欧美精品播放| xvideos亚洲| 神马久久久久久久久久久| 欧美电影在线观看免费| 精品国产乱码久久久久久图片| 九九精品久久久| 成年美女黄网站色大片不卡| 午夜电影一区二区| 日本a级片在线观看| 国产福利在线观看| 久久一日本道色综合| 国产亚洲福利社区| 亚洲爆乳无码一区二区三区| 国产在线麻豆精品观看| 国产综合久久久久| 亚洲天堂999| 奇米影视7777精品一区二区| 日本不卡视频在线播放| 九九热在线免费观看| 在线播放一区| 国外视频精品毛片| 在线免费观看毛片| 亚洲精品在线二区| 午夜精品视频网站| 97超碰人人干| 国产精品日本| 欧美性一区二区三区| 中文字幕亚洲精品一区| 久久av在线| 国产97在线|亚洲| japanese国产在线观看| 奇米色777欧美一区二区| 日韩av免费一区| 国产伦精品一区二区三区视频网站| 亚洲资源av| 国产精品69精品一区二区三区| 欧美特级黄色片| 麻豆精品精品国产自在97香蕉| 国产精品一区二区三区久久| 亚洲天堂视频在线| 国产乱子伦一区二区三区国色天香| 亚洲va码欧洲m码| 高清一区二区三区四区| 91美女片黄在线观看| 日本一区二区三区视频在线播放| 中国日本在线视频中文字幕| 亚洲欧美成人一区二区三区| 男人天堂a在线| 国模套图日韩精品一区二区| 精品视频在线视频| 成年人看片网站| 牛牛精品成人免费视频| 影音先锋欧美精品| 2021亚洲天堂| 欧美亚洲免费| 国产主播欧美精品| 神马午夜精品95| 国产丝袜美腿一区二区三区| 欧美性受xxxx黑人猛交88| 国产www视频在线观看| 色婷婷久久久亚洲一区二区三区| 天天干天天av| 乱中年女人伦av一区二区| 国产一区二区三区视频免费| 超碰97在线人人| 日韩三级电影网址| 一区二区在线电影| 亚洲电影免费观看高清| yy1111111| 国产日产精品_国产精品毛片| 久久精品视频99| 国产毛片aaa| 久99久精品视频免费观看| 国产精品一区二区三区四区五区| 韩国福利在线| 亚洲电影一级黄| av网站在线不卡| 久久99国产精品久久99大师 | 无码国产伦一区二区三区视频 | 男人的天堂一区| 美女在线视频一区| 国产伦理一区二区三区| 天天躁日日躁狠狠躁av| 欧美激情国产精品免费| 亚洲国产婷婷| 久久久精品蜜桃| 超碰97免费观看| 成人线上视频| 欧美精品一区二区三区在线播放| 国产精品酒店视频| 国产日韩视频| 国产精品制服诱惑| 日本视频在线播放| 色天使色偷偷av一区二区| 亚洲一区和二区| 2023国产精品久久久精品双| 国产精品盗摄久久久| 少妇高潮久久久| 一区二区三区在线播放| 超碰人人草人人| 欧美freesex8一10精品| 欧美日韩xxxxx| 国产精品一区二区av白丝下载| 久久看人人爽人人| www插插插无码视频网站| 九九九九九九精品任你躁| 色系列之999| 免费在线不卡av| 深夜在线视频| 在线亚洲精品福利网址导航| 制服丝袜第二页| 99在线精品免费视频九九视| 俄罗斯精品一区二区三区| 精品孕妇一区二区三区| 欧美日韩国产大片| 99久久久免费精品| 韩国一区二区三区| 中文字幕日韩精品久久| 日本a人精品| 精品国产自在精品国产浪潮| 在线观看国产精品入口男同| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 成人在线爆射| 精品亚洲一区二区三区在线观看| 免费日韩一级片| 91视频观看视频| 99re在线视频免费观看| 中文字幕伦av一区二区邻居| 欧美一性一乱一交一视频| 香蕉视频网站在线| 欧美性猛交xxxxx水多| 白丝女仆被免费网站| 久久精品五月| 亚洲欧美日产图| 精品国产亚洲日本| 欧美国产视频一区二区| 人妻一区二区三区| 日本道色综合久久| 自拍偷拍第9页| 国产一区二区三区四区五区入口| 日韩亚洲欧美一区二区| 丁香一区二区| 亲子乱一区二区三区电影| 啊v视频在线| 欧美一级视频精品观看| 国产情侣在线视频| 国产人成一区二区三区影院| 亚洲精品成人在线播放| 欧美一区综合| 麻豆av一区| 国产一区高清| 久久久久久久久久久免费精品| 色吊丝在线永久观看最新版本| 欧美优质美女网站| 视频这里只有精品| 99久久婷婷国产| av污在线观看| 国产精品大片| 色一情一乱一伦一区二区三欧美 | 欧美国产视频在线观看| 欧美日韩卡一| 97色伦亚洲国产| av播放在线观看| 精品成人一区二区三区| 成人免费一级片| 亚洲欧美日韩精品久久久久| 亚洲综合自拍网| 精品在线一区二区| 男人和女人啪啪网站| 91亚洲国产高清| 精品一区二区久久久久久久网站| 欧美亚洲人成在线| 91精品国产色综合久久不卡98口 | 日韩毛片在线免费观看| 久久人人妻人人人人妻性色av| 美女国产一区二区| 日韩中文字幕在线视频观看 | 波多野结衣家庭教师在线播放| 日韩精品欧美| 久久精品国产综合精品 | 欧美一区三区二区在线观看| 国产一区二区久久久久| 国产成人avxxxxx在线看| 日韩精品卡一| 日韩在线观看高清| 奇米影视888狠狠狠777不卡| 日韩女优电影在线观看| 伊人精品在线视频| 色偷偷一区二区三区| 国产极品美女高潮无套嗷嗷叫酒店 | 91福利入口| jizz久久久久久| 欧美在线视频免费播放| av丝袜在线| 欧美成年人视频网站欧美| 97在线观看免费观看高清| 日韩精品视频在线观看网址| 粉嫩av一区二区夜夜嗨| 日韩一区二区三区四区| 中文字幕精品一区二| 色婷婷综合久久久中文字幕| 国产成人在线免费观看视频| 亚洲一二三四区| 久久久久久久久久综合| 亚洲男人天堂一区| 久久福利免费视频| 国产精品久久久久久久久动漫| 中文字幕在线观看免费高清 | 永久久久久久久| 国产精品久久久久毛片软件| 国产调教在线观看| 久久精品免视看| 熟女少妇内射日韩亚洲| 国产日本欧洲亚洲| 成年人看的免费视频| 欧美国产欧美综合| 粉嫩精品久久99综合一区| 国产欧美一区二区三区网站| 制服 丝袜 综合 日韩 欧美| 国产亚洲一本大道中文在线| 波多野结衣a v在线| 久久久久久久久久久久久久久99 | 日韩欧美亚洲综合| 国产精品人人人人| 欧美性生活大片免费观看网址| 麻豆成人免费视频| 日韩欧美在线视频日韩欧美在线视频 | 好看不卡的中文字幕| 国产欧美久久久久| 在线播放一区| 99色精品视频| 日韩精品成人一区二区在线| av网站在线不卡| 国产一区999| av电影在线播放| 91蜜桃在线免费视频| 欧美人妻一区二区三区| 国产精品嫩草久久久久| 午夜精品福利在线视频| 一区二区三区在线观看视频| 国产精品30p| 欧美性高潮在线| 影音先锋黄色网址| 欧美成人福利视频| 天堂中文在线视频| 亚洲图片欧洲图片av| 菠萝蜜视频国产在线播放| 久久久久久91香蕉国产| 深夜福利视频一区二区| 国产一区深夜福利| 9l视频自拍蝌蚪9l视频成人| 快播亚洲色图| 99久久久久国产精品| 日韩精品一区二区免费| 久久九九精品| 超碰在线超碰在线| 2021久久国产精品不只是精品| 久久久精品成人| 亚洲一区二区三区激情| 欧美国产一级片| 日韩女优av电影| 久久av少妇| 九九视频直播综合网| 久久人体大尺度| 91国产在线免费观看| 国产精品片aa在线观看| 亚洲五码在线观看视频| 米奇777在线欧美播放| ass极品水嫩小美女ass| 国产亚洲精品7777| 精品无码m3u8在线观看| 91成人在线免费观看| av免费在线不卡| 国产午夜精品全部视频在线播放 | 日本中文字幕久久看| www.久久久.com| 欧美日韩精品综合| 精品动漫3d一区二区三区免费| 无人在线观看的免费高清视频| 国产91在线|亚洲| 国产三级黄色片| 精品美女久久久久久免费| 精品区在线观看| 中文字幕在线观看亚洲| 欧美大胆a人体大胆做受| 亚洲v日韩v综合v精品v| 国产一区网站| 97av视频在线观看| 丁香五精品蜜臀久久久久99网站| 日本在线观看网址| 色婷婷综合久久久久中文 | 免费观看在线一区二区三区| 日产精品一线二线三线芒果| 最新亚洲一区| 波多野吉衣在线视频| 综合久久国产九一剧情麻豆| 日本熟妇一区二区三区| 亚洲国产欧美在线成人app| 丝袜美腿av在线| 亚洲自拍偷拍福利| 999国产精品永久免费视频app| 成人在线免费播放视频| 99re热这里只有精品免费视频| 久操视频免费在线观看| 欧美一二三四在线| 在线观看三级视频| 成人免费福利在线| 国产精品传媒精东影业在线| 国产成人黄色网址| 日本一区二区三区在线观看| 国产精品自拍第一页| 亚洲一区二区黄| 99久久精品一区二区成人| 色综合久久久久久久久五月| 久色成人在线| av电影网站在线观看| 色综合久久中文字幕综合网| 日本午夜在线| 日本欧美黄网站| jiujiure精品视频播放| 国内自拍视频一区| 国产精品女主播在线观看| 中文字幕 日韩有码| 精品国偷自产在线视频99| 日本午夜免费一区二区| 无码人妻aⅴ一区二区三区日本| 国产乱码精品一区二区三区五月婷| 国产精品丝袜一区二区| 日韩视频中午一区| 国产精品蜜臀| 精品视频一区二区| 麻豆精品网站| 国产jizz18女人高潮| 欧美一级在线视频| 国产777精品精品热热热一区二区| 极品尤物一区二区三区| 午夜在线a亚洲v天堂网2018| 91资源在线播放| 欧美日韩成人一区| 俄罗斯一级**毛片在线播放| 久久久精品动漫| 日本午夜一本久久久综合| 中文字幕在线观看二区| 日韩三级在线免费观看| www.youjizz.com在线| 乱一区二区三区在线播放| 久久精品国产一区二区| 黄色一级视频免费观看| 亚洲精品美女久久久久| jvid一区二区三区| 粉嫩av一区二区三区天美传媒 | 免费一级肉体全黄毛片| 日韩电影中文字幕在线| 欧美黄页在线免费观看| 黄色一级片国产| 久久久久久久免费视频了| 国产手机视频在线| 18久久久久久| 久久精品亚洲人成影院| 亚洲天堂av网站| 欧美日韩激情在线| 国产乱码精品一区二三赶尸艳谈| 欧洲精品码一区二区三区免费看| 久久成人精品无人区| 国产精品成人网站| 中文字幕亚洲第一| 欧美国产极品| 在线观看日本www| 欧美日韩激情视频8区| caoporn免费在线视频|