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