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 之前会执行关闭挂钩操作。

代码参:https://cyiridiumsitewikineed.googlecode.com/svn/trunk/src/javapuzzlers/book/javapuzzlers/ch05/p39/