多进程编程

news2024/12/26 21:39:23

系列文章目录

多进程编程 VS 多线程编程_crazy_xieyi的博客-CSDN博客


文章目录

  • 前言
  • 一、进程创建
  • 二、进程等待

前言

Java对操作系统提供的多进程编程接口这些操作进行了限制,最终给用户只提供了两个操作:进程创建和进程等待


一、进程创建

创建出一个新的进程,让这个新的进程来执行一系列的任务。被创建出来的进程,称为“子进程”;创建子进程的进程。称为“父进程”(谈到多进程,经常会涉及到“父进程,子进程”,但是对于多线程,就没有这种说法)。咱们的服务器进程就相当于父进程,根据服务器进程再创建出来子进程。一个父进程可能有多个子进程,但是一个子进程,只能有一个父进程。Java中内置了一个类 Runtime,就可以根据Runtime.exec方法创建出一个子进程。其中在使用exec这个方法的时候,会传入一个参数。参数是一个字符串,表示一个可执行程序的路径。执行这个方法,就会把指定路径的可执行程序创建出进程并执行。(以下为javac命令创建子进程为例

        //Runtime 在JVM中是一个单例
        Runtime runtime = Runtime.getRuntime();
        //Process就表示“进程”
        Process process = runtime.exec("javac");
执行Process process = runtime.exec("javac")这个代码,就相当于在cmd中输入了一个对应的指令。

 如果出现这种情况,是因为我们的操作系统不认识这个 javac 是什么。其实在输入命令后,操作系统会去一些特定的目录中找,看看是否存在这个对应的可执行文件,存在才能执行,找不到就会出现上面的提示。如果是系统自带的,比如输入“calc(计算器)”马上就会执行计算器这个程序,但是javac本来就是属于外部安装的,不是系统自带的。解决这个问题的方法就是,配置环境变量,即把javac所在的目录加入到path环境变量中。这一点很简单,不做详细介绍了........

 javac是一个控制台程序,它的输出是输入到“标准输出”和“标准错误”这两个特殊的文件中的。想要看到这个程序的运行效果,就得获取到标准输出和标准错误的内容。

一个进程在启动的时候,就会自动打开三个文件:

1.标准输入  对应到键盘

2.标准输出  对应到显示器

3.标准错误  对应到显示器

虽然子进程启动后同样也打开了这三个文件,但是由于子进程没有和IDEA的终端关联,因此在IDEA中是看不到子进程的输出的。要想获取到输出,就需要在代码中手动获取到,可以通过上面的 process 获取到。

   public static void main(String[] args) throws IOException {
        //Runtime 在JVM中是一个单例
        Runtime runtime = Runtime.getRuntime();
        //Process就表示“进程”
        Process process = runtime.exec("javac");
        //获取到子进程的标准输出和标准错误,把这里的内容写入到两个文件中。
        //获取到标准输出
        InputStream stdoutFrom = process.getInputStream();
        FileOutputStream stdoutTo = new FileOutputStream("stdout.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("stderr.txt");
        while (true){
            int ch = stderrFrom.read();
            if (ch == -1){
                break;
            }
            stderrTo.write(ch);
        }
        stderrTo.close();
        stderrFrom.close();
    }

然后运行,就会出现两个文件,就获取到了javac子进程里面的内容。 

二、进程等待

Process process = runtime.exec("javac");

通过这个代码,确实能够创建出子进程,但是此时父子进程之间是“并发执行”的关系。另一方面,往往也需要让父进程知道子进程的执行状态。

在某些场景中,希望父进程等待子进程执行完毕之后,再执行后序代码。比如像在线OJ系统,需要让用户提交代码 ,编译执行代码。肯定是要在编译执行完毕之后,再把响应返回给用户。那么此时父进程就需要等待。

//通过Process类的 waitFor 方法来实现进程的等待。
        //当父进程执行到waitFor的时候,就会阻塞,一直阻塞到子进程执行完毕为止。
        //与多线程中的join是非常类似的
        //这个退出码就表示子进程的执行结果是否ok,如果子进程的代码执行完了就正常退出,此时的退出码就是0;
        //如果子进程在执行过程中出现异常(抛异常),那么返回的退出码就是非0;
        int exitCode = process.waitFor();
  

 注意:当前的代码是裸运行javac(正常的javac后面会跟上具体的.java文件名字之类的),退出码是非0的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 基础知识3-1项目目录结构

上一章我们创建了Hello Word项目,代码是由ADT插件自动生成的,我们没有对其进行编码,所以没有对其框架进行分析。其实每一个平台都有自己的结构框架,所以我们对Android项目的结构也进行分析。 与一般的Java项目一样,src…

Qt 学习(二) —— Qt工程基本文件详解

目录1. pro文件内容解释2. main文件内容解释3. widget.cpp/widget.h文件内容解释4. ui_widget.h文件内容解释5. widget.ui文件内容解释以Widget窗口部件项目为例,新建的工程目录有如下几个文件: QtCreator软件将他们做了如下分组,包含三个文件…

idea快捷搜索键

目录 1、shift shift 双击 2、Ctrl F在当前类中,页中进行查找相关方法等 3、CtrlShiftN按【文件名】搜索文件 4、CtrlH 查看类的继承关系 5、Alt F7 查看类在哪儿被使用 idea全局搜索的快捷键 1、shift shift 双击 可以搜索任何东西。类、资源、配置项…

运行写在字符串中的Python代码 exec(‘‘‘print(1)‘‘‘)

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 运行写在字符串中的Python代码 exec(print(1)) [太阳]选择题 请问对以下Python代码说法错误的是? print("【执行】exec(print(1))") exec(print(1)) myFuncsumab prin…

CTF秀web2

CTF秀web21.分析题目2.解题2.1信息收集3.2获取数据库3.3获取数据库表3.3获取表信息3.uinon注入语句3.1 判断注入3.2 信息收集3.3注入语句1.分析题目 如上图所示,可以看到是sql注入的题目,进入题目看看,题目页面如下: 如上图所示&a…

fastjson反序列化漏洞

1.fastjson反序列化漏洞原理 我们知道fastjson在进⾏反序列化时会调⽤⽬标对象的构造,setter,getter等⽅法,如果这些⽅法内部 进⾏了⼀些危险的操作时,那么fastjson在进⾏反序列化时就有可能会触发漏洞。 我们通过⼀个简单的案例…

kubernetes 资源管理

kubernetes 资源管理 资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在…

纳睿雷达冲刺上市:产能利用率不足仍要扩产,毛利率持续下滑

上海证券交易所信息显示,广东纳睿雷达科技股份有限公司(下称“纳睿雷达”)的IPO进程已有8个月未有变化,上一次更新信息还是2022年3月10日。而证监会网站则显示,已向纳睿雷达发出了注册阶段三次问询问题,最新…

创建线程的几种方式

创建线程的几种方式 文章目录创建线程的几种方式一、继承 Thread 类二、实现 Runnable 接口三、实现 Callable 接口,并结合 Future 实现四、通过线程池创建线程五、前三种创建线程方式对比继承Thread实现Runnable接口实现Callable接口参考链接一、继承 Thread 类 通…

11.20二叉树基础题型

一.二叉树的存储 1.存储结构 存储结构:顺序存储或者是类似于链表的链式存储 二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式 // 孩子表示法 class Node {int val; // 数据域Node left; // 左孩子的引用,常常代…

【SpringBoot项目】一文掌握文件上传和下载【业务开发day04】

文章目录前言文件上传下载文件上传介绍文件下载介绍文件上传代码实现文件下载代码实现新增菜品需求分析数据模型代码开发功能测试🌕博客x主页:己不由心王道长🌕! 🌎文章说明:SpringBoot项目-瑞吉外卖【day04】业务开发…

【SRE】MySQL8的安装方式

MySQL8的安装方式Windows下载配置配置my.ini新建data文件夹初始化将数据库加入服务修改root密码Linux下载配置配置my.ini新建data文件夹初始化将数据库加入服务修改root密码Windows 下载 https://downloads.mysql.com/archives/community/ 选择MySQL8最新版本 选择上面这个 …

node和npm的安装配置使用(借鉴数篇文章避坑)

1.Error: EINVAL: invalid argument, mkdir C:\Users\lm\‪D:\nodejs\node_global 怎么解决? 2.环境配置中D:\Develop\nodejs\node_global\node_modules路径的疑惑? 之前看了很多网上的教程,感觉都是在互相抄,没有自己的东西&am…

m多载波MC-CDMA系统单用户检测方法的研究,对比EGC,MRC,ORC以及MMSE

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 传统CDMA技术在码间串扰和多址干扰等方面存在的问题使其总体性能受到限制,随着OFDM技术的发展,出现了OFDM结合CDMA的信技术,即多载波CDMA技术&#xf…

服务器linux下springboot项目启动、停止、重启脚本+配置jdk+配置maven+批量启动jar包脚本

部署springboot项目配置启动、停止、重启脚本 一.在Linux环境下部署springboot项目 1、把springboot项目打成jar包&#xff0c;使用maven插件实现 1.1、引入maven插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId>…

【自用】Linux-CentOS7安装配置jdk1.8

一、准备工作 步骤1.创建目录 /usr/java 并进入该目录 # 进入/usr/目录 cd /usr/# 创建java目录 mkdir java# 进入java目录 cd java步骤2.下载 jdk-8u351-linux-x64.rpm 链接&#xff1a;https://pan.baidu.com/s/1IWDf70ddcy-u_mDofBklCQ?pwdxrfy 提取码&#xff1a;xrfy …

14.PyQt5应用程序主窗口QmainWindow详解

PyQt5 应用程序主窗口 对于日常见到的应用程序而言&#xff0c;许多都是基于主窗口的&#xff0c;主窗口包含了菜单栏、工具栏、状态栏和中心区域等。 QT/PyQt中提供了以QmainWindow类为核心的主窗口框架&#xff0c;它包含了众多相关的类&#xff0c;它们的继承关系如下图所…

pygame入门之环境配置

14天学习训练营导师课程&#xff1a; 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 前两节和大家一起了解了python的基础&#xff0c;今天我们就来…

互联网电商大厂库存系统设计案例讲解

1 库存扣减 多人同时买一件商品时&#xff08;假设库存充足&#xff09;&#xff0c;每个人几乎同时下单成功&#xff0c;给人一种并行感觉。但真实情况&#xff0c; 库存只是一个数值&#xff0c;无论是存在mysql数据库还是redis缓存&#xff0c;减值时都要控制顺序&#xff0…

Go 协程与Channel管道

风离不摆烂学习日志 Day2 GO 协程 结论&#xff1a; 主线程是一个物理线程&#xff0c;直接作用在cpu上。是重量级的&#xff0c;非常耗费cpu资源。 协程是从主线程开启的&#xff0c;是轻量级的线程&#xff0c;是逻辑态。对资源消耗相对小。 Golang的协程机制是重要的特点&…