日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高并发编程-Runtime.getRuntime().addShutdownHook为自己的应用添加hook

發布時間:2025/3/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高并发编程-Runtime.getRuntime().addShutdownHook为自己的应用添加hook 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • 使用場景
  • 注意事項
  • 示例

概述

一句話概括就是: ShutdownHook允許開發人員在JVM關閉時執行相關的代碼。

我們可以使用java.lang.Runtime.getRuntime().addShutdownHook(Thread t)方法在JVM中添加關閉鉤子。


使用場景

1.程序正常退出 , JVM關閉

2. 調用System.exit ,JVM關閉

3. 程序拋出異常,導致JVM關閉

4. OOM 導致JVM關閉

5. 外界:Ctrl + C ,導致JVM關閉

6. 外界:用戶注銷或者關機,導致JVM關閉

7. 外界:kill 信號 (kill -9 除外)

8. …


注意事項

1. 可以使用addShutdownHook()添加多個shutdown hooks

2. Shutdown hooks 是initialized 但是 not-started的線程,當JVM關閉時被觸發

3. 無法確定shutdown hooks的執行順序,就像執行多線程一樣。

4. 無法保證shutdown hooks會執行,例如系統崩潰,kill命令等。因此,應僅將其用于緊急情況下,例如確保釋放關鍵資源等。不要執行耗時操作

5. 可以使用Runtime.getRuntime().removeShutdownHook(hook)方法刪除鉤子。

6. 啟動關閉掛鉤后,無法刪除,否則拋出IllegalStateException。

7. 如果存在security manager并且它拒絕RuntimePermission(“shutdownHooks”),則將拋出SecurityException。


示例

package com.artisan.test;import java.io.*; import java.util.ArrayList; import java.util.List;/*** Runtime.getRuntime().addShutdownHook Demo*/ public class FileHandler {public static String status = "STOPPED";public static String fileName = "";public static void main(String[] args) {// 添加HOOKRuntime.getRuntime().addShutdownHook(new FileHandlerHook());Runtime.getRuntime().addShutdownHook( new Thread(()->{System.out.println("HOOK TRIGGERED:多個shutdown hook 被觸發...");}));// 文件目錄String directory = "E:\\hooktest";File dir = new File(directory);// 列出txt結尾的文件File[] txtFiles = dir.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {if (name.endsWith(".txt")) {return true;} else {return false;}}});// 模擬觸發Hook的情況 case 1//System.exit(0);// 模擬觸發Hook的情況 case 2//int a = 1 / 0 ;他// OOM // List list = new ArrayList(); // for(int i=0;i<Integer.MAX_VALUE;i++){ // list.add(i+"測試oom 導出jvm退出,觸發hook"); // }// 遍歷數組 讀取文件for (File file : txtFiles) {System.out.println("fileName:" + file.getName());status = "START";BufferedReader bufferedReader = null;try {FileReader fileReader = new FileReader(file);// BufferedReader一行行的讀 提高讀取效率bufferedReader = new BufferedReader(fileReader);String line;// 先讀取一行line = bufferedReader.readLine();// 循環讀取 直到讀取完成while (line != null) {System.out.println(line);// 模擬業務 休眠一會 方便操作Thread.sleep(1_111);line = bufferedReader.readLine();}status = "PROCESSED";} catch (IOException | InterruptedException e) {status = "ERROR";e.printStackTrace();} finally {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}status = "FINISHED";}private static class FileHandlerHook extends Thread {@Overridepublic void run() {System.out.println("Status="+FileHandler.status);System.out.println("FileName="+FileHandler.fileName);if(!FileHandler.status.equals("FINISHED")){System.out.println("HOOK TRIGGERED:Seems some error, sending alert....");}else{System.out.println("HOOK TRIGGERED:handle file over , Do Something notify....");}}} }

上述代碼以及覆蓋了使用場景中的事項 ,使用哪個來做驗證,放開對應注釋即可。

OOM的測試,請設置jvm參數 -Xms10m -Xmx10m , 親測有效,就不貼圖了,自行驗證即可。


總結

以上是生活随笔為你收集整理的高并发编程-Runtime.getRuntime().addShutdownHook为自己的应用添加hook的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。