如果在JVM关闭期间再次调用System.exit()会发生什么?

时间:2013-11-05 20:36:46

标签: java multithreading

是没有操作吗? 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();
  }
}

2 个答案:

答案 0 :(得分:5)

来自Runtime.exit()上的JavaDoc

  

如果在虚拟机开始关闭序列后调用此方法,则如果正在运行shutdown hooks,则此方法将无限期地阻塞。如果已经运行了关闭挂钩并且已启用了退出终结,则此方法如果状态为非零,则使用给定的状态代码暂停虚拟机;否则,它无限期地阻止。

答案 1 :(得分:0)

只是为了你的信息,exit()方法可以抛出SecurityException。

  

抛出:SecurityException - 如果存在安全管理器及其   checkExit方法不允许以指定状态退出。

System (Java Platform SE 7)

  

如果在JVM关闭期间再次调用System.exit()会发生什么?

它取决于安全上下文,但在大多数情况下,在调用exit方法后没有执行任何操作,它只是终止JVM。