确定java关闭钩子线程中的退出状态
发布时间:2020-12-14 05:14:32 所属栏目:Java 来源:网络整理
导读:我想在关机挂起运行时确定进程的退出状态. 我想要一个基于状态代码的逻辑(0或非零) (例如:如果零,则不做任何其他的非零发送警报电子邮件) 你知道我能得到这些信息吗? 解决方法 我试图覆盖SecurityManager checkExit(int status)方法 – 如果System.exit(st
我想在关机挂起运行时确定进程的退出状态.
我想要一个基于状态代码的逻辑(0或非零) (例如:如果零,则不做任何其他的非零发送警报电子邮件) 你知道我能得到这些信息吗? 解决方法
我试图覆盖SecurityManager checkExit(int status)方法 – 如果System.exit(status)被任意调用,那么这个方法是有效的 – 但是,当应用程序退出“正常”(没有活动线程)时,它不会设置状态,或者一个错误会杀死虚拟机.
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); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |