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

Bog*_*mac 5 java multithreading

它没有操作吗?JVM是否避免再次调用关闭挂钩?

对于一个用例,考虑一个为SomeException调用System.exit()的UncaughtExceptionHandler,然后在短时间内在两个单独的线程中抛出SomeException.

此外,假设在新线程中调用System.exit()以避免潜在的死锁.

UPDATE

正如其中一条评论正确地指出的那样,我应该自己测试一下,但我很懒.无论是在常规线程还是守护程序线程中调用System.exit()并在打印后以代码1退出,下面的测试都会成功完成:

Requesting shutdown ...
Shutdown started ...
Requesting shutdown ...
Shutdown completed ...
Run Code Online (Sandbox Code Playgroud)

以下是代码:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

Dol*_*000 5

JavaDoc中Runtime.exit():

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