目录
一、概述
操作系统提供了很多的多进程编程的接口,但是在Java中只提供了两个操作:进程创建,进程等待
二、进程创建
创建出一个新的进程来执行其他的任务,被创建的进行叫做子进程,创建子进程的进程叫做父进程。一个父进程可以有多个子进程,但是一个子进程只能有一个父进程。
在Java里我们使用exec方法来创建进程,每个进程在创建时都会打开三个文件:标准输入文件、标准输出文件、标准错误文件,我们可以通过API来操作这三个文件
public class ExecAPI {
public static void main(String[] args) throws IOException {
// Runtime在jvm是单例
Runtime runtime = Runtime.getRuntime();
// 调用exec创建进程---- process进程对象
Process process = runtime.exec("Java指令");
// 获取子进程标准输出、输入、错误
// 读取标准输入,写入test文件
InputStream stdoutFrom = process.getInputStream();
FileOutputStream stdoutTo = new FileOutputStream("test.txt");
while (true) {
int ch = stdoutFrom.read();
if (ch == -1) {
break;
}
stdoutTo.write(ch);
}
stdoutFrom.close();
stdoutTo.close();
// 读取标准错误,写入err文件
InputStream stderrFrom = process.getErrorStream();
FileOutputStream stderrTo = new FileOutputStream("err.txt");
while (true) {
int ch = stderrFrom.read();
if (ch == -1) {
break;
}
stderrTo.write(ch);
}
stderrFrom.close();
stderrTo.close();
}
}
三、进程等待
上述代码创建出的进程与父进程是并发执行的,当我们需要子进程执行完毕再去执行父进程时,就需要使用进程等待。而进程等待,我们需要使用的process里的waitFor方法
public class ExecAPI {
public static void main(String[] args) throws IOException, InterruptedException {
// 在jvm是单例
Runtime runtime = Runtime.getRuntime();
// 调用
Process process = runtime.exec("java指令");
// 获取子进程标准输出、输入、错误
// 读取标准输入
InputStream stdoutFrom = process.getInputStream();
FileOutputStream stdoutTo = new FileOutputStream("test.txt");
while (true) {
int ch = stdoutFrom.read();
if (ch == -1) {
break;
}
stdoutTo.write(ch);
}
stdoutFrom.close();
stdoutTo.close();
// 读取标准错误
InputStream stderrFrom = process.getErrorStream();
FileOutputStream stderrTo = new FileOutputStream("err.txt");
while (true) {
int ch = stderrFrom.read();
if (ch == -1) {
break;
}
stderrTo.write(ch);
}
stderrFrom.close();
stderrTo.close();
// 进程等待,父进程执行此处时,就会阻塞,直到子进程执行完毕,与Thread里的join类似
// 如果子进程正常退出,该方法返回0 如果子进程代码异常退出。该方法返回非0
int exitCode = process.waitFor();
System.out.println(exitCode);
}
}