Java Runtime類詳解_動力節(jié)點Java學(xué)院整理
一、概述
Runtime類封裝了運行時的環(huán)境。每個 Java 應(yīng)用程序都有一個 Runtime 類實例,使應(yīng)用程序能夠與其運行的環(huán)境相連接。一般不能實例化一個Runtime對象,應(yīng)用程序也不能創(chuàng)建自己的 Runtime 類實例,但可以通過 getRuntime 方法獲取當(dāng)前Runtime運行時對象的引用。一旦得到了一個當(dāng)前的Runtime對象的引用,就可以調(diào)用Runtime對象的方法去控制Java虛擬機(jī)的狀態(tài)和行為。 當(dāng)不被信任的代碼調(diào)用任何Runtime方法時,常常會引起SecurityException異常。
二、常見的應(yīng)用
1、內(nèi)存管理:
Java提供了無用單元自動收集機(jī)制。通過totalMemory()和freeMemory()方法可以知道對象的堆內(nèi)存有多大,還剩多少。Java會周期性的回收垃圾對象(未使用的對象),以便釋放內(nèi)存空間。但是如果想先于收集器的下一次指定周期來收集廢棄的對象,可以通過調(diào)用gc()方法來根據(jù)需要運行無用單元收集器。一個很好的試驗方法是先調(diào)用gc()方法,然后調(diào)用freeMemory()方法來查看基本的內(nèi)存使用情況,接著執(zhí)行代碼,然后再次調(diào)用freeMemory()方法看看分配了多少內(nèi)存。下面的程序演示了這個構(gòu)想。
//此實例來自《java核心技術(shù)》卷一
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);
}
}編譯后運行結(jié)果如下(不同的機(jī)器不同時間運行的結(jié)果也不一定一樣):
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、執(zhí)行其他程序
在安全的環(huán)境中,可以在多任務(wù)操作系統(tǒng)中使用Java去執(zhí)行其他特別大的進(jìn)程(也就是程序)。ecec()方法有幾種形式命名想要運行的程序和它的輸入?yún)?shù)。ecec()方法返回一個Process對象,可以使用這個對象控制Java程序與新運行的進(jìn)程進(jìn)行交互。ecec()方法本質(zhì)是依賴于環(huán)境。
下面的例子是使用ecec()方法啟動windows的記事本notepad。這個例子必須在Windows操作系統(tǒng)上運行。
//此實例來自《Java核心技術(shù)》卷一
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的方法了??梢杂胐estory()方法終結(jié)子進(jìn)程,也可以使用waitFor()方法等待程序直到子程序結(jié)束,exitValue()方法返回子進(jìn)程結(jié)束時返回的值。如果沒有錯誤,將返回0,否則返回非0。下面是關(guān)于ecec()方法的例子的改進(jìn)版本。例子被修改為等待,直到運行的進(jìn)程退出:
//此實例來自《Java核心技術(shù)》卷一
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());
}
}下面是運行的結(jié)果(當(dāng)關(guān)閉記事本后,會接著運行程序,打印信息):
Notepad returned 0
請按任意鍵繼續(xù). . .
當(dāng)子進(jìn)程正在運行時,可以對標(biāo)準(zhǔn)輸入輸出進(jìn)行讀寫。getOutputStream()方法和getInPutStream()方法返回對子進(jìn)程的標(biāo)準(zhǔn)輸入和輸出。
以上所述是小編給大家介紹的Java Runtime類詳解_動力節(jié)點Java學(xué)院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Spring Security Remember me使用及原理詳解
這篇文章主要介紹了Spring Security Remember me使用及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
hashtable桶數(shù)通常會取一個素數(shù)分析
這篇文章主要介紹了hashtable桶數(shù)通常會取一個素數(shù)分析的相關(guān)資料,需要的朋友可以參考下2016-12-12

