日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

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

作者:倆右

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

源碼點(diǎn)擊 study:https://github.com/xiaoshuanglee/study

Shutdown hook是什么

Shutdown hook是Jvm關(guān)閉的鉤子,是通過(guò)Runtime#addShutdownHook(Thread hook)方法來(lái)實(shí)現(xiàn)的,根據(jù)api是注解可知它就是一系例的已初始化但尚未執(zhí)行的線程對(duì)象。我們可以通過(guò)向Jvm注冊(cè)一個(gè)鉤子,實(shí)現(xiàn)在程序退出時(shí)關(guān)閉資源、平滑退出的功能。所謂的優(yōu)雅停機(jī)也可以這么搞。

Jvm關(guān)閉的方式

程序只有在正常關(guān)閉和異常關(guān)閉的情況下才會(huì)調(diào)用鉤子函數(shù)坐一些掃尾的工作,如果是強(qiáng)制關(guān)閉的則不會(huì)調(diào)用,強(qiáng)制關(guān)閉直接無(wú)商量終止jvm進(jìn)程,不給jvm喘息的機(jī)會(huì)。

使用關(guān)閉鉤子的注意事項(xiàng)

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

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

1.業(yè)務(wù)要關(guān)閉的資源

public class StudyResource implements AutoCloseable { @Override public void close() throws Exception { System.out.println("執(zhí)行項(xiàng)目資源關(guān)閉操作"); }}

2.自定義鉤子

/** * @author: lixiaoshuang * @create: 2020-11-25 20:48 **/public class StudyShtudownHook extends Thread { private static final StudyShtudownHook INSTANCE = new StudyShtudownHook(); /** * 需要關(guān)閉的鉤子集合,可以將項(xiàng)目中的資源關(guān)閉操作都放在這里 */ 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注冊(cè)鉤子
  • public class JvmHookDemo { public static void main(String[] args) throws InterruptedException { //自己實(shí)現(xiàn)的鉤子 StudyShtudownHook instance = StudyShtudownHook.getInstance(); //將需要關(guān)閉的資源放到鉤子里 StudyResource studyResource = new StudyResource(); instance.registerAutoCloseable(studyResource); //向jvm注冊(cè)鉤子 Runtime.getRuntime().addShutdownHook(instance); System.out.println("執(zhí)行業(yè)務(wù)邏輯。。。。"); Thread.sleep(5000); System.out.println("業(yè)務(wù)邏輯處理完畢。。。。"); }}

    執(zhí)行這段代碼后輸出:

    執(zhí)行業(yè)務(wù)邏輯。。。。

    業(yè)務(wù)邏輯處理完畢。。。。

    執(zhí)行項(xiàng)目資源關(guān)閉操作

    作者:倆右

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

    總結(jié)

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

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。