nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)
生活随笔
收集整理的這篇文章主要介紹了
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(); } }}執行這段代碼后輸出:
執行業務邏輯。。。。
業務邏輯處理完畢。。。。
執行項目資源關閉操作
作者:倆右
出處:https://segmentfault.com/a/1190000038298447
總結
以上是生活随笔為你收集整理的nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一打开ie就停止工作怎么办 IE打不开怎
- 下一篇: unity 弹出式菜单_Java Swi