IT Notes‎ > ‎Java‎ > ‎Java Language‎ > ‎《Java 解惑》笔记‎ > ‎

Puzzle 39: Hello, Goodbye

你好,再见!

看看下面的代码,会输出什么呢?
public class HelloGoodbye {
        public static void main(String[] args) {
               try {
                     System. out.println("Hello world" );
                     System. exit(0);
              } finally {
                     System. out.println("Goodbye world" );
              }
       }
}

输出:
Hello world

这和 Puzzle 36: Indecisive
的讲解有点不一样。原因是:当 System.exit() 被调用时,虚拟机在关闭前要执行两项清理工作。首先,它执行所有的关闭挂钩操作,这些挂钩已经注册 Runtime.addShutdownHook() 上。这对于释放VM 之外的资源将很有帮助。务必要为那些必须在 VM 退出之前发生的行为关闭挂钩
public class HelloGoodbye1 {
        public static void main(String[] args) {
              System. out.println("Hello world" );
              Runtime. getRuntime().addShutdownHook(new Thread() {
                      public void run() {
                           System. out.println("Goodbye world" );
                     }
              });
              System. exit(0);
       }
}

输出:
Hello world
Goodbye world

如上第一部分代码,System.exit() 将立即停止所有的程序线程,它使 finally 语句块不能得到调用;如上第二部分代码,它在停止 VM 之前会执行关闭挂钩操作。





Comments