JAVA平台进程间协作应用集锦

摘自: bbs.dev.ccidnet.com  被阅读次数: 87


yangyi 于 2008-06-18 14:21:04 提供


摘要:本文介绍了在JAVA平台通过多个进程间的“无缝协作”来实现借助已有进程来帮助开发人员来完成特定任务的一些经典实践。巧妙地使用外部进程,不仅可以极大减少系统的开发成本,也可以提高系统的稳定性和执行效率。 pim^ lP0-  
  T(oQVw u  
  一、引言 N6SdIyS�  
  V5idzbg-Q  
  无论对于哪个平台,进程间的协作都是亮点之一。通过进程间的协作我们可以总合成熟,公共的执行文件来实现自己一些特定的功能(例如:通过数据库工具来实现数据库操作,通过编译工具来实现动态代码的编译等)。所以,无论是在Windows平台还是Unix平台,都提供了进程间协作的机制。例如:Unix和Windows平台下的批处理技术,管道技术等,都是通过利用一些外部进程来实现本进程无法实现的内容。 A;Cdb[Pg8  
  &}\78 8Q1  
  作为JAVA平台,对进程间协作的支持更加简单。JAVA定义了专门的进程I/O流,通过这些进程I/O流,我们就实现进程间的“无缝协作”。 Dz8)c7Md  
  n{Llc+?  
  所谓无缝,是指进程之间并不是简单的调用关系,而是表现为多个进程的合为一体。就像Unix和Windows平台中创建子进程,父进程通过向子进程传递信息来驱动子进程完成任务,子进程执行完毕之后,还会将执行结果反馈给父进程。整个过程似乎只执行一个进程而已。相比之下,JAVA平台实现进程间的无缝连接要比上述的Unix或Windows平台要简单得多。 ^I%*I?-  
  4ZkELW�: *  
  二、进程间协作的实现过程 L@{_5eD  
  YBKv2s{~&*  
  (1)通过Runtime类的静态方法getRuntime来获取Runtime对象 VpL�&ux;  
  }zjj!=a6'  
  (2)通过Runtime类的exec方法来执行可执行文件命令行(可带参数)并获取子进程对象Process pJavac = Runtime.getRuntime()。exec(command); !i~:FoO}o  
  (yg�Zbw5sA  
  (3)将子进程对象的错误流或者输出流作为输入流,并对其进行读取 ;^ ~AtEg9@  
  fNF<pO�  
InputStreamReader isr_error = new InputStreamReader(pJavac.getErrorStream() ); 2]!jpiuFq  
InputStreamReader isr_normal = new InputStreamReader(pJavac.getInputStream() ); B#L56q-w  
//Get the error output from javac 9s'DS?G  
while( (ch = isr_error.read() ) != -1) i C46QE  
{ Z X@FMU"D  
strbuf_error.append((char)ch); T>!!dYXwg  
} ^}lW5  
|L MsP^J  
  (4)等待子进程执行完毕(通过Process类的waitFor方法),即可对子进程输出流进行分析 o]4- \a#}V  
  //Wait for javac process finish <0E`:0R~  
pJavac.waitFor(); :KI428  
`7GGe*%3q  
XF:j[x  
  注意:步骤(4)是必须的,否则读取到的输出可能会不完整。这一点在很多例子中没有讲到。 x%?;?t  
  =z~fRKS RQ  
  读者不难看出,与函数,线程调用不同的是,进程间的创建是重量级的,一般都需要开辟单独的进程空间。对于开发人员而言,很多工具都难使用其内部的函数资源的,即使可以通过动态链接库进行函数载入,但是该过程往往也是相当麻烦。 F-{"`l&  
Y\LP;($jf  
2K@ )  
更多集锦中国it实验室http://java.chinaitlab.com/model/738837.html

原文链接: http://bbs.dev.ccidnet.com/read....