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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM