Process

Process类

通过Process可以在java进程类运行其他进程。

1.核心类

Java.lang.Process

Java.lang.ProcessBuilder

Java.lang.Runtime

2.核心方法

在这里插入图片描述

2.运行过程

在这里插入图片描述

如果Java进程后续的执行依赖于子进程的执行结果,则等待子进程执行结束,否则可以并发执行

3.案例

  1. 通过Runtime执行命令

    可以使用 Runtime.getRuntime().exec(String command) 方法启动一个新的进程。这个方法将指定的命令作为字符串参数,并返回一个 Process 对象,该对象代表了新进程的执行。

  2. 通过runProcess.waitFor();等待执行完毕

    使用 waitFor() 方法可以让当前线程等待与 Process 对象相关联的进程执行完成。这可以用于确保在继续执行后续代码之前等待进程完成。 此方法会返回一个int值(错误码),如果为0则表示程序正常运行

  3. 与进程进行交互

    • 一旦你有了一个 Process 对象,你可以使用它来与进程进行交互。你可以获取进程的输入流(标准输入)、输出流(标准输出)和错误流(标准错误),从中读取或写入数据。这样可以与进程进行双向通信

    • 你可以使用 getInputStream()、getOutputStream() 和 getErrorStream() 方法分别获取这些流。

    • 通过runProcess.getInputStream()获取正常输出结果

    • 通过runProcess.getErrorStream()获取非正常输出结果

      注意:如果我们要获取控制台的输入要调用的是输出流而不是输入流

4, 销毁进程

使用 destroy() 方法可以强制终止与 Process 对象相关联的进程。这应该谨慎使用,因为它可能导致进程异常终止,可能会导致数据丢失或不一致性。

String compileCmd = String.format("javac -encoding utf-8 %s", userCodeFile.getAbsolutePath());
Process compileProcess = Runtime.getRuntime().exec(compileCmd);
// 等待程序执行,获取错误码
int exitValue = runProcess.waitFor();
// 正常退出
            if (exitValue == 0) {
                System.out.println(opName + "成功");
                // 分批获取进程的正常输出
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(runProcess.getInputStream()));
                List<String> outputStrList = new ArrayList<>();
                // 逐行读取
                String compileOutputLine;
                while ((compileOutputLine = bufferedReader.readLine()) != null) {
                    outputStrList.add(compileOutputLine);
                }
                executeMessage.setMessage(StringUtils.join(outputStrList, "\n"));
            } else {
                // 异常退出
                System.out.println(opName + "失败,错误码: " + exitValue);
                // 分批获取进程的正常输出
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(runProcess.getInputStream()));
                List<String> outputStrList = new ArrayList<>();
                // 逐行读取
                String compileOutputLine;
                while ((compileOutputLine = bufferedReader.readLine()) != null) {
                    outputStrList.add(compileOutputLine);
                }
                executeMessage.setMessage(StringUtils.join(outputStrList, "\n"));

                // 分批获取进程的错误输出
                BufferedReader errorBufferedReader = new BufferedReader(new InputStreamReader(runProcess.getErrorStream()));
                // 逐行读取
                List<String> errorOutputStrList = new ArrayList<>();
                // 逐行读取
                String errorCompileOutputLine;
                while ((errorCompileOutputLine = errorBufferedReader.readLine()) != null) {
                    errorOutputStrList.add(errorCompileOutputLine);
                }
                executeMessage.setErrorMessage(StringUtils.join(errorOutputStrList, "\n"));
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值