是没有操作吗? JVM是否避免再次调用关闭挂钩?
对于一个用例,考虑一个为SomeException调用System.exit()的UncaughtExceptionHandler,然后在短时间内在两个独立的线程中抛出SomeException。
另外,假设在新线程中调用System.exit()以避免潜在的死锁。
更新
正如其中一条评论正确地指出的那样,我应该自己测试一下,但我很懒。无论是在常规线程还是守护程序线程中调用System.exit()并在打印后退出代码1,下面的测试都会成功完成:
Requesting shutdown ...
Shutdown started ...
Requesting shutdown ...
Shutdown completed ...
以下是代码:
public class ConcurrentSystemExit {
private final static boolean DAEMON = false;
public static void main(String[] args) throws InterruptedException {
// Register a shutdown hook that waits 6 secs
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
System.out.println("Shutdown started ...");
Thread.sleep(6000);
System.out.println("Shutdown completed ...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// Define a Thread that calls exit()
class ShutdownThread extends Thread {
public void run() {
System.out.println("Requesting shutdown ...");
System.exit(1);
}
}
// Issue first exit()
Thread t1 = new ShutdownThread();
t1.setDaemon(DAEMON);
t1.start();
Thread.sleep(3000);
// Issue second exit()
Thread t2 = new ShutdownThread();
t2.setDaemon(DAEMON);
t2.start();
}
}
答案 0 :(得分:5)
来自Runtime.exit()
上的JavaDoc:
如果在虚拟机开始关闭序列后调用此方法,则如果正在运行shutdown hooks,则此方法将无限期地阻塞。如果已经运行了关闭挂钩并且已启用了退出终结,则此方法如果状态为非零,则使用给定的状态代码暂停虚拟机;否则,它无限期地阻止。
答案 1 :(得分:0)
只是为了你的信息,exit()方法可以抛出SecurityException。
抛出:SecurityException - 如果存在安全管理器及其 checkExit方法不允许以指定状态退出。
如果在JVM关闭期间再次调用System.exit()会发生什么?
它取决于安全上下文,但在大多数情况下,在调用exit方法后没有执行任何操作,它只是终止JVM。