高并发编程-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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高并发编程-自定义带有超时功能的锁
- 下一篇: 高并发编程-捕获线程运行时的异常 + 获