以前总以为java的Runtime.exec()方法会开启一个新的jvm实例,也就是一个新的进程,今天通过程序验证才知道原来这个新的进程只是原来的jvm实例的一个子进程而已。为了说明问题,现在先写一个简单的例子:
public class ProcessJar{
public static void main(String []args)throws Exception{
System.out.println("execute jar file.");
}
}
将这个java文件打包成proc.jar,放置在D:\\test\\proc.jar目录,现在写我们的测试程序:
public class ProcessTest {
public static void main(String []args)throws Exception{
String cmd="java -jar d:\\test\\proc.jar";
Runtime.getRuntime().exec(cmd);
}
}
当我们运行ProcessTest时会发现控制台并没有输出“execute jar file.”,所以这就说明了两个程序的运行已经不在同一个进程中了,为了看到ProcessJar的运行结果,我们可以通过获取输入流的方式,加上如下代码即可:
InputStream in=proc.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
由于子进程的运行和父进程是异步的,所以很多情况下,我们往往想让子进程把运行结果告知父进程,或者说让父进程等待子进程执行完成,也就是指同步执行,这就需要使用Process类提供的一个方法:waitFor(),这个方法会阻塞当前线程的执行,知道子进程执行结束,如果子进程正常结束会返回0,否则子进程异常退出。