参考链接
应用场景
B进程负责处理数据,结果输出在标准输出中,A进程作为B的父进程去启动B进程,A进程可以获取到B进程的stdout,stderr。
1、解耦:假设B进程是java语言开发,那么A进程可以是shell,可以是c++也可以是python,这样就做到了解耦。原理就是父子进程通信, 这种通信方式是pip管道通信。 对进程通信想要详细了解的同学可以去查阅相关资料,展示代码demo父子进程都是java版本。
2、防止系统崩溃:个人在一次开发中,需要用到C++开发的方法,但是其有Bug,当数据异常时会导致进程崩溃(C++读到空指针了)。此时系统就会直接退出,需要重新启动,这在生产上是大事故,是无法容忍的。此时的解决方案就是开辟一个新的进程去处理数据,这样即使数据异常,core的也是新的进程,对系统正在运行的进程不会有影响。
父进程代码
import java.io.*;
//process.getInputStream是用来读取控制台命令结果的 控制台数据的流入可以往System.out
//process.getOutputStream是用来往控制台写入数据的 此结果可以由System.in端读出
public class Father {
public static void main(String[] args) throws IOException {
Runtime run = Runtime.getRuntime();
// 获取java执行命令所在的位置
String java = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
// 获取类加载的时候的加载的class文件的路径,返回结果是一个string,多个路径之间用";"分割.
String cp = "\"" + System.getProperty("java.class.path");
// 获取当前程序的class文件所在的位置
cp += File.pathSeparator + ClassLoader.getSystemResource("").getPath() + "\"";
// java -cp 命令 (这是运行class文件的命令,会将class文件载入jvm)
String cmd = java + " -cp " + cp + " connect.test2.Child";
// 开启一个子进程
Process child_process = run.exec(cmd);
// 往子进程写数据
DataOutputStream dataOutputStream = new DataOutputStream(child_process.getOutputStream());
dataOutputStream.writeUTF("hello child");
dataOutputStream.close();//注意这个close方法,写完之后记得关闭
System.out.println("写出成功");
// 父进程获取子进程控制台数据
DataInputStream dataInputStream= new DataInputStream(child_process.getInputStream());
while (true){
String line = dataInputStream.readUTF();
System.out.println(line);
if(line.contains("end")){
break;
}
}
dataInputStream.close();
}
}
子进程代码
import java.io.*;
//其实System.out是一个流对象:源码:public class PrintStream extends FilterOutputStream
//System.out.println("")其实是PrintStream.print()
public class Child {
public static void main(String[] args) throws IOException, InterruptedException {
// 子进程获取父进程的数据
DataInputStream dataInputStream =new DataInputStream(System.in);
String line = dataInputStream.readUTF();
// 将子进程的数据输入到子进程的控制台
DataOutputStream dataOutputStream = new DataOutputStream(System.out);
dataInputStream.close();
for(int i=0;i<2;i++) {
// 数据将流入当前进程的控制台也就是System.out
dataOutputStream.writeUTF("hi" + line);
}
dataOutputStream.writeUTF("end");
dataOutputStream.close();
}
}