如果您不希望另一个程序(通过它的主要方法调用)能够关闭正在运行的JVM,那么就可以看到三个选项:
1.使用SecurityManager
设置 SecurityManager 使其阻止
System.exit呼叫:
public class Test { public static void main(String args[]) { SecurityManager sm = System.getSecurityManager(); System.setSecurityManager(new SecurityManager() { @Override public void checkExit(int status) { throw new SecurityException("Client program exited."); } }); try { System.out.println("hello"); System.exit(0); System.out.println("world"); } catch (SecurityException se) { System.out.println(se.getMessage()); } }}版画 :
helloClient program exited.
这可能是最好的解决方案。这是应用程序服务器阻止任意servlet终止整个服务器的方式。
2.单独的JVM
例如,在单独的JVM中运行其他程序
ProcessBuilder
import java.io.*;public class Test { public static void main(String args[]) throws IOException { ProcessBuilder pb = new ProcessBuilder("java", "other.Program"); pb.redirectErrorStream(); Process p = pb.start(); InputStream is = p.getInputStream(); int ch; while ((ch = is.read()) != -1) System.out.print((char) ch); is.close(); System.out.println("Client program done."); }}3.改用关机钩
不要禁止终止JVM,而要添加关闭钩子,以清理“集线器”并正常退出。(只有一次运行一个“外部”程序时,此选项才有意义。)
import java.io.*;public class Test { public static void main(String args[]) throws IOException { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { System.out.println("Uninitializing hub..."); System.out.println("Exiting gracefully."); } }); // Run client program System.out.println("Running... running... running..."); System.exit(0); }}印刷品:
Running... running... running...Uninitializing hub...Exiting gracefully.



