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"));
            }
Process在不同场景下有不同含义和用途,以下是一些相关信息: ### 在Java编程场景 Process类是非常有用的类,ProcessBuilder.start() 和 Runtime.exec 方法能创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法 [^2]。而且虽然 Process 新开了一个进程,但代码不会等待其进程执行,会直接往下执行,代码执行完毕之后,Java 程序结束,Process 对象消失,而 Process 对应的进程可能关闭也可能开启,这取决于进程开启速度和 Java 程序退出速度的快慢 [^1]。 ### 在 Python 编程场景 在 Python 的 `multiprocessing` 模块中也有 Process 类,可用于创建子进程。例如可以通过函数式方式创建子进程,创建时可指定 `target` 参数来指定子进程要执行的函数,使用 `start()` 方法启动子进程。若创建对象时没有给定 `target` 参数,会调用执行 Process 类中 `run` 方法;若指定了 `target` 参数,`start()` 会调用 `target` 指定的函数去执行 [^4]。示例代码如下: ```python from multiprocessing import Process import os, time # 函数式方式创建子进程 def sub_process(name): print(f'子进程PID:{os.getpid()},父进程的PID:{os.getppid()},--------{name}') time.sleep(1) def sub_process2(name): print(f'子进程PID:{os.getpid()},父进程的PID:{os.getppid()},--------{name}') time.sleep(1) if __name__ == '__main__': # 主进程 print('主进程开始执行') for i in range(5): # 创建第一个子进程 p1 = Process(target=sub_process, args=('xxy',)) # 没有给定target参数,不会执行自己编写的函数中的代码,会调用执行Process类中run方法 # 创建第二个子进程 p2 = Process(target=sub_process2, args=(18,)) p1.start() # 如果Process类创建对象时没有target参数,就调用Process类中的run方法去执行 p2.start() # 如果Process类创建对象时指定了target参数,start()调用target指定的函数去执行 # 终止进程 # p1.terminate() # p2.terminate() print('主程序执行结束') ``` ### 在 Oracle 数据库场景 在 Oracle 中有专用服务器和共享服务器两种模式。在专用模式下,一个会话对应一个 server process,控制 server process 的参数为 Process。例如可以通过 `show parameter process` 查看相关参数 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值