一、概述
Runtime類封裝了運行時的環境。每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環境相連接。一般不能實例化一個Runtime對象,應用程序也不能創建自己的 Runtime 類實例,但可以通過 getRuntime 方法獲取當前Runtime運行時對象的引用。一旦得到了一個當前的Runtime對象的引用,就可以調用Runtime對象的方法去控制Java虛擬機的狀態和行為。 當不被信任的代碼調用任何Runtime方法時,常常會引起SecurityException異常。
二、常見的應用
1、內存管理:
Java提供了無用單元自動收集機制。通過totalMemory()和freeMemory()方法可以知道對象的堆內存有多大,還剩多少。Java會周期性的回收垃圾對象(未使用的對象),以便釋放內存空間。但是如果想先于收集器的下一次指定周期來收集廢棄的對象,可以通過調用gc()方法來根據需要運行無用單元收集器。一個很好的試驗方法是先調用gc()方法,然后調用freeMemory()方法來查看基本的內存使用情況,接著執行代碼,然后再次調用freeMemory()方法看看分配了多少內存。下面的程序演示了這個構想。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//此實例來自《java核心技術》卷一 class MemoryDemo{ public static void main(String args[]){ Runtime r = Runtime.getRuntime(); long mem1,mem2; Integer someints[] = new Integer[ 1000 ]; System.out.println( "Total memory is :" + r.totalMemory()); mem1 = r.freeMemory(); System.out.println( "Initial free is : " + mem1); r.gc(); mem1 = r.freeMemory(); System.out.println( "Free memory after garbage collection : " + mem1); //allocate integers for ( int i= 0 ; i< 1000 ; i++) someints[i] = new Integer(i); mem2 = r.freeMemory(); System.out.println( "Free memory after allocation : " + mem2); System.out.println( "Memory used by allocation : " +(mem1-mem2)); //discard Intergers for ( int i= 0 ; i< 1000 ; i++) someints[i] = null ; r.gc(); //request garbage collection mem2 = r.freeMemory(); System.out.println( "Free memory after collecting " + "discarded integers : " + mem2); } } |
編譯后運行結果如下(不同的機器不同時間運行的結果也不一定一樣):
1
2
3
4
5
6
|
Total memory is : 2031616 Initial free is : 1818488 Free memory after garbage collection : 1888808 Free memory after allocation : 1872224 Memory used by allocation : 16584 Free memory after collecting discarded integers : 1888808 |
2、執行其他程序
在安全的環境中,可以在多任務操作系統中使用Java去執行其他特別大的進程(也就是程序)。ecec()方法有幾種形式命名想要運行的程序和它的輸入參數。ecec()方法返回一個Process對象,可以使用這個對象控制Java程序與新運行的進程進行交互。ecec()方法本質是依賴于環境。
下面的例子是使用ecec()方法啟動windows的記事本notepad。這個例子必須在Windows操作系統上運行。
1
2
3
4
5
6
7
8
9
10
11
12
|
//此實例來自《Java核心技術》卷一 class ExecDemo { public static void main(String args[]){ Runtime r = Runtime.getRuntime(); Process p = null ; try { p = r.exec( "notepad" ); } catch (Exception e) { System.out.println( "Error executing notepad." ); } } } |
ecec()還有其他幾種形式,例子中演示的是最常用的一種。ecec()方法返回Process對象后,在新程序開始運行后就可以使用Process的方法了。可以用destory()方法殺死子進程,也可以使用waitFor()方法等待程序直到子程序結束,exitValue()方法返回子進程結束時返回的值。如果沒有錯誤,將返回0,否則返回非0。下面是關于ecec()方法的例子的改進版本。例子被修改為等待,直到運行的進程退出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//此實例來自《Java核心技術》卷一 class ExecDemoFini { public static void main(String args[]){ Runtime r = Runtime.getRuntime(); Process p = null ; try { p = r.exec( "notepad" ); p.waitFor(); } catch (Exception e) { System.out.println( "Error executing notepad." ); } System.out.println( "Notepad returned " + p.exitValue()); } } |
下面是運行的結果(當關閉記事本后,會接著運行程序,打印信息):
Notepad returned 0
請按任意鍵繼續. . .
當子進程正在運行時,可以對標準輸入輸出進行讀寫。getOutputStream()方法和getInPutStream()方法返回對子進程的標準輸入和輸出。
以上所述是小編給大家介紹的Java Runtime類詳解_動力節點Java學院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!