JAVA-多进程开发-创建等待进程

前言

        在项目中,为了实现“并发编程”(同时执行多个任务),就引入了“多进程编程”,把一个很大的任务,拆分成若干个很小的任务,创建多个进程,每个进程分别负责其中的一部分任务。

        这也带来了一些问题:创建/销毁进程,比较低效,所以就引入了线程,每个线程都是一个独立的执行流,一个进程包含了一个或多个线程,创建线程/销毁线程 比 创建进程/销毁进程 更高效。

        因此,在 Java 圈子中,大部分的并发编程都是通过多线程的方式实现的,但是进程也有线程比不上的优势 ---->  进程的独立性

        操作系统中,同一时刻运行着很多个进程,如果某一个进程挂了,不会影响其他的进程(每个进程有各自的地址空间),相比之下,由于多个线程共用一个进程的地址空间,某个线程挂了,就有可能会把整个进程都祸害掉

        所以对于使用进程还是线程实现并发编程,我们要根据项目的特性来考虑

多进程介绍

        站在操作系统的角度(如 Linux )提供了很多和多进程编程相关的接口,比如:进程创建,进程终止,进程等待,进程程序替换,进程间通信 ......

        而 Java 中对系统提供的这些操作进行了限制,最终给用户提供了两个操作:1.进程创建  2.进程等待

进程创建&等待

        创建出一个新的进程,让这个新的进程来执行一系列的任务,被创建出来的进程称为子进程,创建子进程的进程称为父进程

代码演示

/*** 测试进程的创建* */
public class TestExec {public static void main(String[] args) throws IOException, InterruptedException {// Runtime 采用了单例模式,只能有一个实例Runtime runtime=Runtime.getRuntime();//创建并运行了一个进程,相当于在控制台输入了 javac 运行Process process=runtime.exec("javac");// javac 是一个控制台程序,它的输出是输出到“标准输出”和“标准错误”这两个特殊文件中的//要想看到这个程序的运行结果,就要去获取“标准输出”和“标准错误”这两个特殊文件中的内容//为什么在 idea 中看不到上述进程运行的结果?//一个进程在启动的时候会自动的打开 3 个文件://  1.标准输入(对应键盘)//  2.标准输出(对应显示器)//  3.标准错误(对应显示器)//虽然子进程启动以后也打开了这 3 个文件,但是由于子进程没有和 idea 的终端关联,因此在 idea 中看不到子进程的输出,需要手动获取// 获取标准输出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("stdError.txt");while (true){int ch=stdErrFrom.read();if(ch==-1){break;}stdErrTo.write(ch);}stdErrFrom.close();stdErrTo.close();//执行 Process 类的 waitFor 方法来实现进程的等待//父进程执行到 waitFor 方法时就会阻塞,阻塞到子进程执行完毕为止(和 Thread.join 是很像的)//返回的 exitCode 是退出码,退出码用于表示进程是否正确执行完毕,如果正确执行完毕就返回 0 ,非 0 代表进程出现异常int exitCode=process.waitFor();System.out.println(exitCode);}
}

       执行以上代码,可以得到空的 stdOut.txt 文件,与如下所示的 stdError.txt 文件,说明我们成功创建了一个进程,执行了 javac 命令

        注意,以上的演示代码相当于创建了一个进程执行了 javac 操作,相当于在控制器中输入了   javac 并执行,要是没有配置 jdk 的环境变量就得不了正确的结果,关于环境变量的配置推荐看

配置 JDK 环境变量(最简单)

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

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

相关文章

Qt QWidget以及各种控件、布局 核心属性(适合入门使用时查询)

目录 1. QWidget核心属性 2. 按钮类控件 2.1 PushButton 核心属性 2.2 RadioButton 核心属性 2.3 CheckBox 和 Tool Button 核心属性 3. 显示类控件 3.1 Label 核心属性 3.2 LCDNumber 核心属性 3.3 ProgressBar 核心属性 3.4 Calendar Widget 核心属性 4. 输入类控…

正态分布-形状与特点

更多AI技术入门知识与工具使用请看下面链接: https://student-api.iyincaishijiao.com/t/iNSVmUE8/

【Typora】markdown神器之Typora无限使用安装与基本操作教程

🌼一、概述 Typora是一款轻量级的Markdown编辑器,它提供了简洁的界面和直观的操作方式,专注于让用户更加专注于写作。Typora支持实时预览功能,用户在编辑Markdown文档时可以即时看到最终的样式效果,这有助于提高写作效…

机器学习案例3:从科学论文图片中提取标题、作者和摘要

在这个项目中,我的目标是从科学论文图片中提取某些部分(标题、作者和摘要)。预期提取部分是科学论文中常见的部分,例如标题、摘要和作者。输入与最终结果。我的输入是将第一页纸转换成图像。最终结果是一个 txt 文件,其中包含标题、作者和摘要部分,如下图1和图2所示。我将…

推荐一些写博客用到的图片网站

写博客的时候偶尔会用到一些精美的图片作为封面,有的网站需要翻墙才能访问到,其中推荐一些 ai 生成或无版权的更为合理些 持续更新中,定时清除访问不了的站点! 文章目录 壁纸照片 壁纸 1、wallhaven:https://wallhave…

在Ubuntu 14.04上使用Consul服务发现系统的介绍

简介 Consul 是一个分布式、高可用、数据中心感知的服务发现和配置系统。它可以用来呈现服务和节点,提供灵活和强大的接口,使客户端始终能够获取其所属基础设施的最新视图。 Consul 提供了许多不同的功能,用于提供关于基础设施的一致和可用…

数据结构入门(3)1:顺序表接口实现

前言 本文将一一介绍顺序表基本功能的接口实现&#xff0c;帮助大家提高编程能力&#xff0c;加深对数据结构的理解 本文将以动态顺序表为主进行解释 基本接口功能 #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #inc…

【原创 附源码】Flutter集成谷歌支付详细流程(附源码)

最近有时间&#xff0c;特意整理了一下之前使用过的Flutter平台的海外支付&#xff0c;附源码及demo可供参考 这篇文章只记录Google支付的详细流程&#xff0c;相关Flutter文章链接如下&#xff1a; 【原创 附源码】Flutter集成Apple支付详细流程(附源码) 【原创 附源码】Flu…

【大数据Hive】hive 表设计常用优化策略

目录 一、前言 二、hive 普通表查询原理 2.1 操作演示说明 2.1.1 创建一张表&#xff0c;并加载数据 2.1.2 统计3月24号的登录人数 2.1.3 查询原理过程总结 2.2 普通表结构带来的问题 三、hive分区表设计 3.1 区表结构 - 分区设计思想 3.2 操作演示 3.2.1 创建分区表…

解决MAC连上wifi或热点却不能上网问题

解决MAC连上wifi或热点却不能上网问题 #新换的mac昨天还能连上wifi&#xff0c;今天就不好使了。 找到连接的wifi点击详细信息&#xff0c;选择TCP/IP 中的配置IPV4 选择关闭

独孤思维:绝版书副业又优化了

做副业&#xff0c;不光要低头干活&#xff0c;还要抬头看路。 我做绝版书那会&#xff0c;实操的心得和经验会分享给学员。 学员实操久了&#xff0c;就会在自己实操的过程中&#xff0c;总结自己的经验。 有些经验&#xff0c;比独孤的还好。 比如上周&#xff0c;群里有…

Python Matplotlib 的学习笔记

Python Matplotlib 的学习笔记 0. Python Matplotlib 简介1. 为什么要用 Matplotlib&#xff1f;2. Matplotlib 基础类详解2-1. Line&#xff08;线&#xff09;2-2. Marker&#xff08;标记&#xff09;2-3. Text&#xff08;文本&#xff09;2-4. Legend&#xff08;图例&…

Vue3-01

Vue.js &#xff08;通常简称为 Vue&#xff09;是一套用于构建用户界面的渐进式框架。与其他框架不同的是&#xff0c;Vue采用了自底向上增量开发的设计。Vue的核心库只关注视图层&#xff0c;并且非常容易与现有项目集成。Vue也完全支持通过插件的方式进行扩展。Vue的设计理念…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第二天-arm ads下的start.S分析(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1E4x2TX_9SYhxM9sWfnehMg?pwd1688 提取码&#xff1a;1688 ; ; NAME: 2440INIT.S ; DESC: C start up codes ; Configure memory, ISR ,stacks ; Initialize C-variables ; 完全注释 ; HISTORY: ; 2002.02.25:kwtark: ver 0.…

中国电子学会2023年12月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)

2023-12 Scratch一级真题 分数&#xff1a;100 题数&#xff1a;37 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1.观察下列每个圆形中的四个数&#xff0c;找出规律&#xff0c;在括号里填上适当的数&#xff1f;&#xff08;C&#xff09;&#xf…

预处理详解(下)

1.#运算符 #运算符将宏的一个参数转换为字符串字面量。它仅允许出现在带参数的宏的替换列表中。 #运算符所执行的操作可以理解为”字符串化“。 例如&#xff1a; 我们将打印的字符串中的n改为参数n,这样在传参的时候就也会随着变化。假如我们不将其改为参数n的话会发生什么呢…

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(3) 保存表格数据

对上两篇篇的工作C Qt框架开发| 基于Qt框架开发实时成绩显示排序系统&#xff08;1&#xff09;-CSDN博客和C Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统&#xff08;2&#xff09;折线图显示-CSDN博客继续优化&#xff0c;增加一个保存按钮&#xff0c;用于保存成绩数据…

论文阅读-面向机器学习的云工作负载预测模型的性能分析

论文名称&#xff1a;Performance Analysis of Machine Learning Centered Workload Prediction Models for Cloud 摘要 由于异构服务类型和动态工作负载的高变异性和维度&#xff0c;资源使用的精确估计是一个复杂而具有挑战性的问题。在过去几年中&#xff0c;资源使用和流…

给定n个结点的树,其中有k个结点是特殊结点(未知),定义好结点:该结点到k个特殊结点的距离之和最小。若随机k个结点为特殊结点,求好结点个数的期望值

题目 思路: 举例: 其中黑色结点为特殊结点,可以看出,每种情况都有一个结点的s值不等于k / 2,但是是好结点,所以最后答案加一。 #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second …

支持向量机SVM

支持向量机&#xff08;SVM&#xff0c;Support Vector Machines&#xff09;是一种广泛使用的监督学习方法&#xff0c;适用于分类、回归和其他任务。SVM的核心思想是找到一个最优的决策边界&#xff08;在二维空间中是一条线&#xff0c;在更高维度是一个超平面&#xff09;&…