日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
聊聊如何優(yōu)雅的關(guān)閉服務(wù)?

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

在六合等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),六合網(wǎng)站建設(shè)費用合理。

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

關(guān)閉 JVM

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

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

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

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

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

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

shutdown hook

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

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

添加鉤子

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

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

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

System.exit(123);

我要關(guān)閉了

然后我們會看到,鉤子實際上是將消息打印到標準輸出。

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

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

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

很明顯,我們也不能多次注冊一個鉤子。

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

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

刪除鉤子

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

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

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

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

注意事項

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

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

Runtime.getRuntime().halt(123);

halt 方法強行終止了當前運行的JVM。因此,注冊的關(guān)閉鉤子不會有機會執(zhí)行。

總結(jié)

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


本文題目:聊聊如何優(yōu)雅的關(guān)閉服務(wù)?
鏈接URL:http://m.5511xx.com/article/dhppodc.html