看到RM在处理异常的时候使用了两种退出方式,而且是针对不同的异常。特意查询了一些资料来看看,两种方式有什么不同。
System.exit
终止当前正在运行的Java虚拟机。参数作为状态代码,按照惯例,一个非零状态码表示异常终止。
用线程描述,在多线程情况下,可能更准确一些
1.调用方法后,线程会退出
2.未捕获的异常被线程抛出,但如果有其他非守护线程,程序将继续运行。
3.反馈状态码,一般在脚本中有用。
4.线程退出,还是做一些清理动作
------------------------------------------------------------------------------------
Java虚拟机退出包括两个阶段:
第一个阶段:会以某种未指定的顺序启动所有已注册钩子,并且允许它们同时运行直至结束
第二个阶段:如果已启用runFinalizersOnExit设置为true,则运行所有未调用的终结方法(finalizer方法)
------------------------------------------------------------------------------------
Runtime.getRuntime().halt(status)
现在runtime的halt比较好理解了,他不会执行钩子函数和finalizer方法,而是直接退出。
+++++++++++++
详细英文解析,可以看JDK源码或是Javadoc
+++++++++++++以下是自己写的一个Demo,以作验证+++++++++++++
/**
* @author yanbit
* @date Aug 18, 2015 3:02:01 PM
*
*/
public class SystemExitAndRuntimeHaltDemo {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread t = new Thread(new Hook());
Runtime.getRuntime().addShutdownHook(t);
}
//System.exit(1);
//Runtime.getRuntime().halt(-1);
}
}
class Hook implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+" hook...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}