java的进程

以前总以为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,否则子进程异常退出。

展开阅读全文

没有更多推荐了,返回首页