nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)
作者:倆右
出處: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(); } }}執(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)題。
- 上一篇: 一打开ie就停止工作怎么办 IE打不开怎
- 下一篇: unity 弹出式菜单_Java Swi