你好,再见!
看看下面的代码,会输出什么呢?
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/