System.exit(0)作为最后一个语句会有所作为吗?

时间:2014-10-07 21:11:33

标签: java

Java 1.5 +

A班与B班有何不同?

public class A {
    public static void main(String args[]) {
        System.out.println("Ending..");
        System.exit(0);
    }
}

public class B {
    public static void main(String args[]) {
        System.out.println("Ending..");
    }
}

如果System.exit(0)System.exit(1)是要执行的程序的最后一个语句,那么A类和B类在程序执行的各个方面都会表现相同吗?

据我所知,按照惯例,非零状态代码表示异常终止。

2 个答案:

答案 0 :(得分:1)

Class A“明确”关闭。这意味着如果有任何非守护进程线程仍在运行,它们将被显式停止(被告知,而不是消失)。

Class B“隐式”关闭,看看主线程是如何在这种情况下运行的唯一非守护程序线程,并且在print语句之后,它将结束。

查看Thread#setDaemon(boolean)的文档:当运行的唯一线程都是守护程序线程时,Java虚拟机退出。”

最后,应用程序关闭,所以我猜它并没有真正有所作为,除了第一个被告知关闭,第二个“死掉”。最好让线程消失,而不是被告知。这是一个额外的步骤;您也不需要在exit(int)方法中执行任何额外的语句。可以在此处找到该方法的代码:GrepCode: Shutdown#exit(int)

答案 1 :(得分:0)

  • 如果您未使用System.exit()明确指定退出代码,则默认退出代码为0
  • 我不确定,但可能会影响File.deleteOnExit()来电。
  • Systeme.exit()会立即终止您的程序,即使其他非守护程序线程仍在运行。如果ClassB这些线程和您的程序将继续运行,直到所有非守护程序线程退出。