日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)

發布時間:2025/4/5 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:倆右

出處:https://segmentfault.com/a/1190000038298447

源碼點擊 study:https://github.com/xiaoshuanglee/study

Shutdown hook是什么

Shutdown hook是Jvm關閉的鉤子,是通過Runtime#addShutdownHook(Thread hook)方法來實現的,根據api是注解可知它就是一系例的已初始化但尚未執行的線程對象。我們可以通過向Jvm注冊一個鉤子,實現在程序退出時關閉資源、平滑退出的功能。所謂的優雅停機也可以這么搞。

Jvm關閉的方式

程序只有在正常關閉和異常關閉的情況下才會調用鉤子函數坐一些掃尾的工作,如果是強制關閉的則不會調用,強制關閉直接無商量終止jvm進程,不給jvm喘息的機會。

使用關閉鉤子的注意事項

  • 關閉鉤子本質上是一個線程(也稱為Hook線程),對于一個JVM中注冊的多個關閉鉤子它們將會并發執行,所以JVM并不保證它們的執行順序;由于是并發執行的,那么很可能因為代碼不當導致出現競態條件或死鎖等問題,為了避免該問題,強烈建議在一個鉤子中執行一系列操作。
  • Hook線程會延遲JVM的關閉時間,這就要求在編寫鉤子過程中必須要盡可能的減少Hook線程的執行時間,避免hook線程中出現耗時的計算、等待用戶I/O等等操作。
  • 關閉鉤子執行過程中可能被強制打斷,比如在操作系統關機時,操作系統會等待進程停止,等待超時,進程仍未停止,操作系統會強制的殺死該進程,在這類情況下,關閉鉤子在執行過程中被強制中止。
  • 在關閉鉤子中,不能執行注冊、移除鉤子的操作,JVM將關閉鉤子序列初始化完畢后,不允許再次添加或者移除已經存在的鉤子,否則JVM拋出 IllegalStateException。
  • 不能在鉤子調用System.exit(),否則卡住JVM的關閉過程,但是可以調用Runtime.halt()。
  • Hook線程中同樣會拋出異常,對于未捕捉的異常,線程的默認異常處理器處理該異常,不會影響其他hook線程以及JVM正常退出

簡單例子(具體可看源碼)

1.業務要關閉的資源

public class StudyResource implements AutoCloseable { @Override public void close() throws Exception { System.out.println("執行項目資源關閉操作"); }}

2.自定義鉤子

/** * @author: lixiaoshuang * @create: 2020-11-25 20:48 **/public class StudyShtudownHook extends Thread { private static final StudyShtudownHook INSTANCE = new StudyShtudownHook(); /** * 需要關閉的鉤子集合,可以將項目中的資源關閉操作都放在這里 */ private final Set autoCloseableHashSet = new HashSet<>(); private StudyShtudownHook() { } public static StudyShtudownHook getInstance() { return INSTANCE; } public void registerAutoCloseable(final AutoCloseable autoCloseable) { autoCloseableHashSet.add(autoCloseable); } @Override public void run() { this.closeAll(); } @SneakyThrows private void closeAll() { for (AutoCloseable autoCloseable : autoCloseableHashSet) { autoCloseable.close(); } }}
  • 向jvm注冊鉤子
  • public class JvmHookDemo { public static void main(String[] args) throws InterruptedException { //自己實現的鉤子 StudyShtudownHook instance = StudyShtudownHook.getInstance(); //將需要關閉的資源放到鉤子里 StudyResource studyResource = new StudyResource(); instance.registerAutoCloseable(studyResource); //向jvm注冊鉤子 Runtime.getRuntime().addShutdownHook(instance); System.out.println("執行業務邏輯。。。。"); Thread.sleep(5000); System.out.println("業務邏輯處理完畢。。。。"); }}

    執行這段代碼后輸出:

    執行業務邏輯。。。。

    業務邏輯處理完畢。。。。

    執行項目資源關閉操作

    作者:倆右

    出處:https://segmentfault.com/a/1190000038298447

    總結

    以上是生活随笔為你收集整理的nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。