成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊如何優(yōu)雅的關(guān)閉服務(wù)?

開發(fā) 前端
JVM 只在正常終止的情況下運(yùn)行關(guān)閉鉤子。因此,當(dāng)外部力量突然殺死JVM進(jìn)程時(shí),JVM將沒有機(jī)會(huì)執(zhí)行關(guān)閉鉤子。此外,從Java代碼中停止JVM也會(huì)產(chǎn)生同樣的效果。

大家好,我是指北君。

通常,啟動(dòng)一個(gè)服務(wù)是很容易的。然而,有時(shí)我們需要有一個(gè)計(jì)劃來優(yōu)雅地關(guān)閉一個(gè)服務(wù)。

在本教程中,我們將看一下 JVM 應(yīng)用程序終止的不同方式。然后,我們將使用 Java APIs 來管理 JVM 關(guān)閉鉤子。

關(guān)閉 JVM

JVM 可以通過兩種不同的方式被關(guān)閉。

  • 一種受控的方式
  • 一種非受控的方式

一個(gè)受控的進(jìn)程在以下兩種情況下關(guān)閉 JVM。

  • 最后一個(gè)非 daemon 線程終止。例如,當(dāng)主線程退出時(shí),JVM 開始其關(guān)閉進(jìn)程
  • 從操作系統(tǒng)發(fā)送一個(gè)中斷信號(hào)。例如,通過按 Ctrl + C 或注銷操作系統(tǒng)
  • 從 Java 代碼中調(diào)用 System.exit()

雖然我們都在努力爭(zhēng)取優(yōu)雅的關(guān)閉,但有時(shí) JVM 可能會(huì)以突然和意外的方式關(guān)閉。JVM 會(huì)在以下情況下突然關(guān)閉。

  • 從操作系統(tǒng)發(fā)送一個(gè) kill 信號(hào)。例如,通過發(fā)出 kill -9 的信號(hào)
  • 從 Java 代碼中調(diào)用 Runtime.getRuntime().halt() 。
  • 主機(jī)操作系統(tǒng)意外關(guān)閉,例如,在電源故障或操作系統(tǒng)崩潰的情況下

shutdown hook

JVM 允許在完成關(guān)機(jī)之前運(yùn)行注冊(cè)函數(shù)。這些函數(shù)通常是釋放資源或其他類似的內(nèi)部管理任務(wù)的好地方。在 JVM 的術(shù)語(yǔ)中,這些函數(shù)被稱為關(guān)閉鉤子。

關(guān)閉鉤子基本上是初始化但未啟動(dòng)的線程。當(dāng)JVM開始其關(guān)閉過程時(shí),它將以一個(gè)未指定的順序啟動(dòng)所有注冊(cè)的鉤子。在運(yùn)行完所有鉤子后,JVM 將停止運(yùn)行。

添加鉤子

為了添加一個(gè)關(guān)閉鉤子,我們可以使用 Runtime.getRuntime().addShutdownHook() 方法。

Thread printingHook = new Thread(() -> System.out.println("我要關(guān)閉了"));
Runtime.getRuntime().addShutdownHook(printingHook);

在這里,我們只是在JVM自行關(guān)閉之前向標(biāo)準(zhǔn)輸出端打印一些東西。如果我們像下面這樣關(guān)閉JVM。

System.exit(123);

我要關(guān)閉了

然后我們會(huì)看到,鉤子實(shí)際上是將消息打印到標(biāo)準(zhǔn)輸出。

JVM負(fù)責(zé)啟動(dòng)鉤子線程。因此,如果給定的鉤子已經(jīng)被啟動(dòng)了,Java將拋出一個(gè)異常。

Thread longRunningHook = new Thread(() -> {
try {
Thread.sleep(300);
} catch (InterruptedException ignored) {}
});
longRunningHook.start();

assertThatThrownBy(() -> Runtime.getRuntime().addShutdownHook(longRunningHook))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("鉤子正在運(yùn)行");

很明顯,我們也不能多次注冊(cè)一個(gè)鉤子。

Thread unfortunateHook = new Thread(() -> {});
Runtime.getRuntime().addShutdownHook(unfortunateHook);

assertThatThrownBy(() -> Runtime.getRuntime().addShutdownHook(unfortunateHook))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("鉤子已經(jīng)注冊(cè)");

刪除鉤子

Java 提供了一個(gè)孿生的移除方法,以便在注冊(cè)一個(gè)特定的關(guān)閉鉤子后將其移除。

Thread willNotRun = new Thread(() -> System.out.println("鉤子不會(huì)運(yùn)行的"));
Runtime.getRuntime().addShutdownHook(willNotRun);

assertThat(Runtime.getRuntime().removeShutdownHook(willNotRun)).isTrue();

當(dāng)關(guān)閉鉤子被成功刪除時(shí),removeShutdownHook() 方法返回true。

注意事項(xiàng)

JVM 只在正常終止的情況下運(yùn)行關(guān)閉鉤子。因此,當(dāng)外部力量突然殺死JVM進(jìn)程時(shí),JVM將沒有機(jī)會(huì)執(zhí)行關(guān)閉鉤子。此外,從Java代碼中停止JVM也會(huì)產(chǎn)生同樣的效果。

Thread haltedHook = new Thread(() -> System.out.println("強(qiáng)行終止"));
Runtime.getRuntime().addShutdownHook(haltedHook);

Runtime.getRuntime().halt(123);

halt 方法強(qiáng)行終止了當(dāng)前運(yùn)行的JVM。因此,注冊(cè)的關(guān)閉鉤子不會(huì)有機(jī)會(huì)執(zhí)行。

總結(jié)

在本教程中,我們研究了 JVM 應(yīng)用程序可能終止的不同方式。然后,我們使用一些運(yùn)行時(shí)API來注冊(cè)和取消注冊(cè)關(guān)閉鉤子。

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2025-06-30 07:10:00

JavaJVM線程

2021-01-19 10:35:49

JVM場(chǎng)景函數(shù)

2021-03-28 09:17:18

JVM場(chǎng)景鉤子函數(shù)

2024-04-24 12:34:08

Spring事務(wù)編程

2024-10-14 14:28:19

支付系統(tǒng)設(shè)計(jì)

2017-12-19 10:03:44

JavaLinux代碼

2024-11-13 16:37:00

Java線程池

2020-10-16 11:48:06

服務(wù)器系統(tǒng)運(yùn)維

2021-12-06 09:57:25

容器Linux信號(hào)

2021-04-20 08:00:31

Redisson關(guān)閉訂單支付系統(tǒng)

2021-07-14 06:45:49

Windows.NetTopshelf

2022-09-08 07:32:56

JDK7程序管理

2025-01-13 06:00:00

Go語(yǔ)言gRPC

2023-11-30 07:40:05

URLCMS

2019-11-18 15:50:11

AjaxJavascript前端

2024-05-31 08:45:24

2025-02-12 00:21:44

Java并發(fā)編程

2023-01-29 09:06:24

微服務(wù)劃分關(guān)聯(lián)

2023-08-07 08:32:05

RocketMQ名字服務(wù)

2021-02-07 09:05:56

微服務(wù)結(jié)構(gòu)云原生
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 在线观看亚洲专区 | 一级黄色录像毛片 | 欧美日韩一区二区视频在线观看 | 99精品久久久久久久 | 欧美v日韩v | 日韩在线中文字幕 | 全免一级毛片 | 精品一区国产 | 亚洲国产自产 | 毛片综合| 久久一级大片 | 三级免费av | 日韩中文字幕 | 午夜免费视频 | 日韩成人影院 | 日韩精品一区二区三区在线播放 | 成人免费小视频 | 欧美 日韩 国产 成人 在线 91 | 久久亚洲视频网 | 国产精品三级 | 精品国产乱码一区二区三区 | 日韩精品一区二区三区 | 欧美在线日韩 | 99精品一级欧美片免费播放 | 国产精品爱久久久久久久 | 亚洲精品电影在线观看 | 欧美性区 | 一级片在线视频 | 96国产精品久久久久aⅴ四区 | 亚洲欧美一区二区三区在线 | 中文字幕一区在线观看视频 | 欧美综合国产精品久久丁香 | 一区二区精品 | 色婷婷综合久久久中字幕精品久久 | 久久三级av | 欧美一区二区在线观看 | 一区二区三区视频 | 久久99久久99精品免视看婷婷 | 亚洲免费人成在线视频观看 | 欧美综合视频 | 一级片成人 |