nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)
生活随笔
收集整理的這篇文章主要介紹了
nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
作者:倆右
出處:https://segmentfault.com/a/1190000038298447
源碼點擊 study:https://github.com/xiaoshuanglee/study
Shutdown hook是什么
Shutdown hook是Jvm關閉的鉤子,是通過Runtime#addShutdownHook(Thread hook)方法來實現(xiàn)的,根據(jù)api是注解可知它就是一系例的已初始化但尚未執(zhí)行的線程對象。我們可以通過向Jvm注冊一個鉤子,實現(xiàn)在程序退出時關閉資源、平滑退出的功能。所謂的優(yōu)雅停機也可以這么搞。
Jvm關閉的方式
程序只有在正常關閉和異常關閉的情況下才會調(diào)用鉤子函數(shù)坐一些掃尾的工作,如果是強制關閉的則不會調(diào)用,強制關閉直接無商量終止jvm進程,不給jvm喘息的機會。
使用關閉鉤子的注意事項
- 關閉鉤子本質(zhì)上是一個線程(也稱為Hook線程),對于一個JVM中注冊的多個關閉鉤子它們將會并發(fā)執(zhí)行,所以JVM并不保證它們的執(zhí)行順序;由于是并發(fā)執(zhí)行的,那么很可能因為代碼不當導致出現(xiàn)競態(tài)條件或死鎖等問題,為了避免該問題,強烈建議在一個鉤子中執(zhí)行一系列操作。
- Hook線程會延遲JVM的關閉時間,這就要求在編寫鉤子過程中必須要盡可能的減少Hook線程的執(zhí)行時間,避免hook線程中出現(xiàn)耗時的計算、等待用戶I/O等等操作。
- 關閉鉤子執(zhí)行過程中可能被強制打斷,比如在操作系統(tǒng)關機時,操作系統(tǒng)會等待進程停止,等待超時,進程仍未停止,操作系統(tǒng)會強制的殺死該進程,在這類情況下,關閉鉤子在執(zhí)行過程中被強制中止。
- 在關閉鉤子中,不能執(zhí)行注冊、移除鉤子的操作,JVM將關閉鉤子序列初始化完畢后,不允許再次添加或者移除已經(jīng)存在的鉤子,否則JVM拋出 IllegalStateException。
- 不能在鉤子調(diào)用System.exit(),否則卡住JVM的關閉過程,但是可以調(diào)用Runtime.halt()。
- Hook線程中同樣會拋出異常,對于未捕捉的異常,線程的默認異常處理器處理該異常,不會影響其他hook線程以及JVM正常退出
簡單例子(具體可看源碼)
1.業(yè)務要關閉的資源
public class StudyResource implements AutoCloseable { @Override public void close() throws Exception { System.out.println("執(zhí)行項目資源關閉操作"); }}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(); } }}執(zhí)行這段代碼后輸出:
執(zhí)行業(yè)務邏輯。。。。
業(yè)務邏輯處理完畢。。。。
執(zhí)行項目資源關閉操作
作者:倆右
出處:https://segmentfault.com/a/1190000038298447
總結(jié)
以上是生活随笔為你收集整理的nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一打开ie就停止工作怎么办 IE打不开怎
- 下一篇: c 递归下降识别程序_看动画轻松理解递归