美文网首页
System.exit(status)和Runtime.getR

System.exit(status)和Runtime.getR

作者: 珊珊宝贝Catherine | 来源:发表于2018-05-15 10:58 被阅读18次
    System.exit(status);
    Runtime.getRuntime().halt(status)
    

    System.exit(status)解释如下:

    Terminates the currently running Java Virtual Machine.
    The  argument serves as a status code; 
    by convention, a nonzero status code indicates abnormal termination 
    

    终止当前正在运行的Java虚拟机。参数作为状态代码,按照惯例,一个非零状态码表示异常终止。
    用线程描述,在多线程情况下,可能更准确一些。

    1. 调用方法后,线程会退出。
    2. 未捕获的异常被线程抛出,但如果有其他非守护线程,程序将继续运行。
    3. 反馈状态码,一般在脚本中有用。
    4. 线程退出,还是做一些清理动作。
    源码:
    /**
         * Terminates the currently running Java virtual machine by initiating its
         * shutdown sequence.  This method never returns normally.  The argument
         * serves as a status code; by convention, a nonzero status code indicates
         * abnormal termination.
         *
         * <p> The virtual machine's shutdown sequence consists of two phases.  In
         * the first phase all registered {@link #addShutdownHook shutdown hooks},
         * if any, are started in some unspecified order and allowed to run
         * concurrently until they finish.  In the second phase all uninvoked
         * finalizers are run if {@link #runFinalizersOnExit finalization-on-exit}
         * has been enabled.  Once this is done the virtual machine {@link #halt
         * halts}.
         *
         * <p> If this method is invoked after the virtual machine has begun its
         * shutdown sequence then if shutdown hooks are being run this method will
         * block indefinitely.  If shutdown hooks have already been run and on-exit
         * finalization has been enabled then this method halts the virtual machine
         * with the given status code if the status is nonzero; otherwise, it
         * blocks indefinitely.
         *
         * <p> The <tt>{@link System#exit(int) System.exit}</tt> method is the
         * conventional and convenient means of invoking this method. <p>
         *
         * @param  status
         *         Termination status.  By convention, a nonzero status code
         *         indicates abnormal termination.
         *
         * @throws SecurityException
         *         If a security manager is present and its <tt>{@link
         *         SecurityManager#checkExit checkExit}</tt> method does not permit
         *         exiting with the specified status
         *
         * @see java.lang.SecurityException
         * @see java.lang.SecurityManager#checkExit(int)
         * @see #addShutdownHook
         * @see #removeShutdownHook
         * @see #runFinalizersOnExit
         * @see #halt(int)
         */
        public void exit(int status) {
            // Make sure we don't try this several times
            synchronized(this) {
                if (!shuttingDown) {
                    shuttingDown = true;
    
                    Thread[] hooks;
                    synchronized (shutdownHooks) {
                        // create a copy of the hooks
                        hooks = new Thread[shutdownHooks.size()];
                        shutdownHooks.toArray(hooks);
                    }
    
                    // Start all shutdown hooks concurrently
                    for (Thread hook : hooks) {
                        hook.start();
                    }
    
                    // Wait for all shutdown hooks to finish
                    for (Thread hook : hooks) {
                        try {
                            hook.join();
                        } catch (InterruptedException ex) {
                            // Ignore, since we are at VM shutdown.
                        }
                    }
    
                    // Ensure finalization on exit, if requested
                    if (finalizeOnExit) {
                        runFinalization();
                    }
    
                    // Get out of here finally...
                    nativeExit(status);
                }
            }
        }
    
    Java虚拟机退出包括两个阶段:

    第一个阶段:会以某种未指定的顺序启动所有已注册钩子,并且允许它们同时运行直至结束。
    第二个阶段:如果已启用runFinalizersOnExit设置为true,则运行所有未调用的终结方法(finalizer方法)。

    Runtime.getRuntime().halt(status)解释如下:

    Forcibly terminates the currently running Java virtual machine.  
    This method never returns normally. 
    

    现在runtime的halt比较好理解了,他不会执行钩子函数和finalizer方法,而是直接退出。

    源码
     /**
         * Forcibly terminates the currently running Java virtual machine.  This
         * method never returns normally.
         *
         * <p> This method should be used with extreme caution.  Unlike the
         * <tt>{@link #exit exit}</tt> method, this method does not cause shutdown
         * hooks to be started and does not run uninvoked finalizers if
         * finalization-on-exit has been enabled.  If the shutdown sequence has
         * already been initiated then this method does not wait for any running
         * shutdown hooks or finalizers to finish their work. <p>
         *
         * @param  status
         *         Termination status.  By convention, a nonzero status code
         *         indicates abnormal termination.  If the <tt>{@link Runtime#exit
         *         exit}</tt> (equivalently, <tt>{@link System#exit(int)
         *         System.exit}</tt>) method has already been invoked then this
         *         status code will override the status code passed to that method.
         *
         * @throws SecurityException
         *         If a security manager is present and its <tt>{@link
         *         SecurityManager#checkExit checkExit}</tt> method does not permit
         *         an exit with the specified status
         *
         * @see #exit
         * @see #addShutdownHook
         * @see #removeShutdownHook
         * @since 1.3
         */
        public void halt(int status) {
            nativeExit(status);
        }
    
    

    相关文章

      网友评论

          本文标题:System.exit(status)和Runtime.getR

          本文链接:https://www.haomeiwen.com/subject/umdedftx.html