我們可以看看如下的代碼:
// Test2.java文件
import java.io.*;
public class Test
{
public static void main(String[] args)
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("由父進程輸入的信息:" + br.readLine());
}
}
// Test_Exec_In.java
import java.io.*;
public class Test_Exec_In
{
public static void main(String[] args)
{
Runtime run = Runtime.getRuntime();
Process p = run.exec("java test2");
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(p.getOutputStream()));
bw.write("向子進程輸出信息");
bw.flush();
bw.close(); // 必須得關閉流,否則無法向子進程中輸入信息
// System.in.read();
}
}
從以上代碼可以看出,Test1得到由Test_Exec_In發(fā)過來的信息,并將其輸出。當你不加bw.flash()和bw.close()時,信息將無法到達子進程,也就是說子進程進入阻塞狀態(tài),但由于父進程已經(jīng)退出了,因此,子進程也跟著退出了。如果要證明這一點,可以在最后加上System.in.read(),然后通過任務管理器(在windows下)查看Java進程,你會發(fā)現(xiàn)如果加上bw.flush()和bw.close(),只有一個java進程存在,如果去掉它們,就有兩個Java進程存在。這是因為,如果將信息傳給Test2,在得到信息后,Test2就退出了。在這里有一點需要說明一下,exec的執(zhí)行是異步的,并不會因為執(zhí)行的某個程序阻塞而停止執(zhí)行下面的代碼。因此,可以在運行test2后,仍可以執(zhí)行下面的代碼。
exec方法經(jīng)過了多次的重載。上面使用的只是它的一種重載。它還可以將命令和參數(shù)分開,如exec("java.test2")可以寫成exec("java", "test2")。exec還可以通過指定的環(huán)境變量運行不同配置的Java虛擬機。
除了使用Runtime的exec方法建立子進程外,還可以通過ProcessBuilder建立子進程。ProcessBuilder的使用方法如下:
// Test_Exec_Out.java
import java.io.*;
public class Test_Exec_Out
{
public static void main(String[] args)
{
ProcessBuilder pb = new ProcessBuilder("java", "test1");
Process p = pb.start();
… …
}
}
在建立子進程上,ProcessBuilder和Runtime類似,不同的ProcessBuilder使用start()方法啟動子進程,而Runtime使用exec方法啟動子進程。得到Process后,它們的操作就完全一樣的。
ProcessBuilder和Runtime一樣,也可設置可執(zhí)行文件的環(huán)境信息、工作目錄等。
ProcessBuilder pb = new ProcessBuilder("Command", "arg2", "arg2", ’’’);
// 設置環(huán)境變量
Map env = pb.environment();
env.put("key1", "value1");
env.remove("key2");
env.put("key2", env.get("key1") + "_test");
pb.directory("..\abcd"); // 設置工作目錄
Process p = pb.start(); // 建立子進程
相關推薦:2009年9月計算機等考二級ACCESS模擬試題匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |