System.exit和Runtime halt区别

看到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();
    }
  }
}

时间: 2024-08-03 22:08:57

System.exit和Runtime halt区别的相关文章

android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别

Activity.finish() 在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法. 当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放.因为移出了栈,所以当你点击手机上面的"back"按键的时候,也不会找到这个Activity. Activity.onDestory() 系统销毁了这个Activity的实例在内存中占据的空间. 在Activity的生命周期中,

android finish和system.exit(0)的区别

finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理:当调用System.exit(0)时,杀死了整个进程, 这时候活动所占的资源也会被释放. 在开发android应用时,常常通过按返回键(即keyCode == KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下该应用还在任务里运行着,其实这不是我们想要的结果. 我们可以这样做,当用户点击自定义的退出按钮或返回键时(需要捕获动

android开发时,finish()跟System.exit(0)的区别

这两天在弄Android,遇到一个问题:所开发的小游戏中有背景音乐,玩的过程中始终有音乐在放着,然后在我退出游戏后,音乐还在播放! 我看了一下我最开始写的退出游戏的代码,就是简单的finish()语句.我想应该是这个地方出了问题.后来想了想,以前好像见过有用System.exit(0)退出游戏的,然后就尝试了一下,发现问题果然解决了. 现在来彻底弄清楚两者的区别. 首先一个Activity是有生命周期的,onCreate,onStart,onResume,onPause,onStop,onDes

finish/onDestroy/System.exit()的区别

Activity.finish():Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法. 当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放.因为移出了栈,所以当 你点击手机上面的“back”按键的时候,也不会再找到这个Activity. Activity.o

System.exit(-1)和return 的区别

对于只有一个单一方法的类或者系统来说是一样的,但是对于含有多个类和方法,且调用关系比较复杂时就不一样了. System.exit(-1)是指所有程序(方法,类等)停止,系统停止运行. return只是这一个方法停止,并不影响其他方法的顺序运行.比如: void a(){ b(); c(); d(); }其中b()中是return.c()是System.exit(-1);那么 b()会执行,c()会执行,而d()不会被执行. System.exit(int status) public stati

android Process.killProcess 和 System.exit(0) 区别

1 Process.killProcess  和 System.exit(0) 两个都会 kill 掉当前进程. 你可以打开 DDMM 查看进程号,进程确实被 kill 掉了. 2 如果是在第一个 Activity 调用 Process.killProcess 或 System.exit(0) 都会 kill 掉当前进程. 但是如果不是在第一个 Activity 中调用,如 ActivityA 启动 ActivityB ,你在 ActivityB 中调用 Process.killProcess

安卓开发-Activity中finish() onDestroy() 和System.exit()的区别

Activity.finish()Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法.当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放.因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个Activity.Activity.onDes

Android学习笔记六:finish、onDestory、system.exit(0)的区别

Activity.finish():Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法. 当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放.因为移出了栈,所以当 你点击手机上面的“back”按键的时候,也不会再找到这个Activity. Activity.o

安卓开发-Activity中finish() onDestroy() 和System.exit()的区别(转)

Activity.finish()Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法.当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放.因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个Activity.Activity.onDes