确定Java关闭挂钩线程中的退出状态

确定Java关闭挂钩线程中的退出状态,第1张

确定Java关闭挂钩线程中的退出状态

我试图覆盖该

SecurityManager
checkExit(int status)
方法-
如果
System.exit(status)
在任何地方都显式调用此方法,则该方法有效-
但是,当应用程序“正常”退出(无活动线程)或错误导致VM退出时,它不会设置状态。

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.security.Permission;public class ExitChecker {    public ExitChecker() {        System.setSecurityManager(new ExitMonitorSecurityManager());        Runtime.getRuntime().addShutdownHook(new Thread(new MyShutdownHook()));        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));        String line = "";        while (!line.equalsIgnoreCase("Q")) { try {     System.out.println("Press a number to exit with that status.");     System.out.println("Press 'R' to generate a RuntimeException.");     System.out.println("Press 'O' to generate an OutOfMemoryError.");     System.out.println("Press 'Q' to exit normally.");     line = input.readLine().trim();     processInput(line); } catch (IOException e) {     e.printStackTrace();     System.exit(-1); }        }    }    private void processInput(String line) {        if (line.equalsIgnoreCase("Q")) { // continue, will exit loop and exit normally        } else if (line.equalsIgnoreCase("R")) { throwRuntimeException();        } else if (line.equals("O")) { throwError();        } else { // try to parse to number try {     int status = Integer.parseInt(line);     callExit(status); } catch(NumberFormatException x) {     // not a number.. repeat question...     System.out.println("nUnrecognized input...nn"); }        }    }    public void callExit(int status) {        System.exit(status);    }    public void throwError() {        throw new OutOfMemoryError("OutOfMemoryError");    }    public void throwRuntimeException() {        throw new RuntimeException("Runtime Exception");    }    public static void main(String[] args) {        new ExitChecker();    }    private static class ExitMonitorSecurityManager extends SecurityManager {        @Override        public void checkPermission(Permission perm) { //System.out.println(perm.getName()); //System.out.println(perm.getActions());        }        @Override        public void checkPermission(Permission perm, Object context) { //System.out.println(perm.getName()); //System.out.println(perm.getActions());        }        @Override        public void checkExit(int status) { System.out.println("Setting exit value via security manager..."); MyShutdownHook.EXIT_STATUS = status;        }    }    private static class MyShutdownHook implements Runnable {        public static Integer EXIT_STATUS;        public void run() { System.out.println("In MyShutdownHook - exit status is " + EXIT_STATUS);        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5132710.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存