多线程并发和进程通信模拟

一、实验目的:

  1. 通过编写多线程并发和进程通信的模拟代码,加深对多线程编程和进程通信的理解。
  2. 学习如何使用Java中的多线程和管道流来实现并发执行和进程间通信。
  3. 掌握多线程的基本概念和使用方法,以及进程通信的实现方式。

实验设备与实验环境:

计算机,Java编译系统,idea,ChatGPT

二、实验程序设计内容:

实验分为两部分:一部分是多线程并发(Exam_2.1),另一部分是进程通信(Exam_2.2)。

  1. Exam_2.1部分:用户输入并发进程的数量和执行次数,创建对应数量的线程,每个线程执行指定次数的任务并输出执行信息。
  2. Exam_2部分:使用管道流进行进程间通信,主线程创建子线程往管道中写入数据,主线程读取子线程写入的数据并输出。

三、实验程序设计思路及流程图

  1. 在Exm2_1方法中,用户输入并发进程的数量和执行次数,创建对应数量的线程对象,并启动这些线程。
  2. 每个线程对象是myThread类的实例,其中包含线程的ID和执行次数。线程运行时输出对应的执行信息,并通过Thread.sleep模拟执行过程。
  3. 在Exm2_2方法中,使用PipedInputStream和PipedOutputStream创建管道流,并连接起来。
  4. 创建子线程写入数据到管道中,在子线程中调用myPipe.writeToPipe方法,用户输入要发送给父进程的消息,写入管道后关闭输出流。
  5. 主线程读取管道中的数据并输出,同时等待子线程结束。通过这种方式实现了进程间的通信。
  6. 在myPipe类中,实现了写入管道的方法,用户输入消息后将消息写入管道。

四、实验源程序及注释:

package homework.os;import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;/*** Date:2024/3/11  8:23* Description:TODO** @author Leon* @version 1.0*/public class exm2 {public static void main(String[] args) {System.out.println("Please input the experiment you want to select \n" +"(1-Exam_2.1(thread) | 2-Exam_2.2(pipe)");if (new Scanner(System.in).nextInt() == 1) Exm2_1();else Exm2_2();}static void Exm2_1() {Scanner sc = new Scanner(System.in);List<Thread> tList = new LinkedList<>();System.out.println("Please enter the number of concurrent processes");int n = sc.nextInt();System.out.println("Please enter the number of process executions");int m=sc.nextInt();for (int i = 1; i <= n; i++)tList.add(new myThread(i,m));for (Thread t : tList)t.start();for (Thread t : tList)try {t.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Main thread exiting");}static void Exm2_2() {PipedInputStream in = new PipedInputStream();PipedOutputStream out = new PipedOutputStream();try {out.connect(in);// 创建子线程写数据到管道Thread writerThread = new Thread(() -> {try {myPipe.writeToPipe(out);} catch (IOException e) {e.printStackTrace();}});writerThread.start();// 读取数据从管道byte[] buffer = new byte[1024];int bytesRead = in.read(buffer);String receivedMessage = new String(buffer, 0, bytesRead);System.out.println("Received from child process: " + receivedMessage);writerThread.join(); // 等待子线程结束} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}class myThread extends Thread {private int threadId;private int exe;public myThread(int threadId,int exe) {this.threadId = threadId;this.exe=exe;}@Overridepublic void run() {for (int i = 1; i <= exe; i++) {System.out.println("Thread " + threadId + " is running: 第" + i + "次执行");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}class myPipe {static void writeToPipe(PipedOutputStream out) throws IOException {System.out.println("Enter the message to send to the parent process: ");String message = new Scanner(System.in).nextLine();out.write(message.getBytes());out.close();}
}

五、实验程序测试过程及解释说明

1.多线程并发

Please input the experiment you want to select

(1-Exam_2.1(thread) | 2-Exam_2.2(pipe)

1

Please enter the number of concurrent processes

5

Please enter the number of process executions

3

2.进程通信

Please input the experiment you want to select

(1-Exam_2.1(thread) | 2-Exam_2.2(pipe)

2

Enter the message to send to the parent process:

A1高闪来一个,秋梨膏

六、实验程序测试过程与结果分析、

1.多线程并发

Thread 1 is running: 第1次执行

Thread 5 is running: 第1次执行

Thread 4 is running: 第1次执行

Thread 2 is running: 第1次执行

Thread 3 is running: 第1次执行

Thread 2 is running: 第2次执行

Thread 4 is running: 第2次执行

Thread 3 is running: 第2次执行

Thread 1 is running: 第2次执行

Thread 5 is running: 第2次执行

Thread 2 is running: 第3次执行

Thread 3 is running: 第3次执行

Thread 5 is running: 第3次执行

Thread 4 is running: 第3次执行

Thread 1 is running: 第3次执行

Main thread exiting

2.进程通信

Received from child process: A1高闪来一个,秋梨膏

七、理论学习与实践能力锻炼方面的个人心得体会

通过本次实验,我深入了解了多线程并发和进程通信的实现方式。

多线程并发能够提高程序的执行效率,同时需要注意线程间的同步和互斥问题。

进程通信是不同进程之间进行数据交换和通信的重要方式,管道流是其中一种简单有效的实现方式。

通过实验,我对Java中多线程编程和进程通信有了更深入的理解,为以后的程序设计和开发积累了经验。

       

实验评价及结论:

实验目的明确、设计内容符合要求,独立完成了操作系统多线程并发和进程通信模拟程序设计任务且源程序与注释、测试过程记录完整正确,能够很好地将课程理论运用于解决实际问题;实验报告内容完整,态度认真,总体质量优秀。

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

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

相关文章

C#实现TFTP客户端

1、文件结构 2、TftpConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TftpTest {public class TftpConfig{}/// <summary>/// 模式/// </summary>public enum Modes{…

Linux论坛搭建

1.安装httpd服务 1.1安装httpd软件 [rootlocalhost yum.repos.d]# dnf install httpd 1.2.修改httpd的配置 [rootlocalhost yum.repos.d]# vim /etc/httpd/conf/httpd.conf 1.3.启动这个httpd服务,并查看它的状态 [rootlocalhost yum.repos.d]# systemctl start httpd [ro…

NLP(8)--利用RNN实现多分类任务

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 循环神经网络RNN&#xff08;recurrent neural network&#xff09;&#xff1a; 主要思想&#xff1a;将整个序列划分成多个时间步&#xff0c;将每一个时间步的信息依次输入模型&#xff0c;同时将模型输出的结果传给下一个…

JavaEE——spring MVC请求处理

目录 主要目的&#xff1a; 1. Spring web 项目搭建 2. 添加依赖 3. 配置插件 4. 配置设置类 5. 编写controller层类 6. 编写测试的http请求 主要目的&#xff1a; 创建一个spring web项目&#xff1b; 创建控制类&#xff1b; 掌握如何配置MVC&#xff1b; 编写htt…

【机器学习-18】特征筛选:提升模型性能的关键步骤

一、引言 在机器学习领域&#xff0c;特征筛选是一个至关重要的预处理步骤。随着数据集的日益庞大和复杂&#xff0c;特征的数量往往也随之激增。然而&#xff0c;并非所有的特征都对模型的性能提升有所贡献&#xff0c;有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关…

在Visual Studio中查看C项目使用的C语言版本

在Visual Studio中查看C项目使用的C语言版本&#xff0c;可以通过以下步骤进行&#xff1a; 打开Visual Studio。 打开你的C项目。 右键点击项目名称&#xff0c;选择“属性”。 在弹出的属性页中&#xff0c;找到“配置属性” -> “C/C” -> “语言”。 在右侧的“…

(十三)PostgreSQL的扩展(extensions)

PostgreSQL的扩展&#xff08;extensions&#xff09; 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777在Post…

Django框架之python后端框架介绍

一、网络框架及MVC、MTV模型 1、网络框架 网络框架&#xff08;Web framework&#xff09;是一种软件框架&#xff0c;用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具&#xff0c;以简化开发过程并提高开发效率。网络框架通常包括以下功能…

常用组件(启停活动页面、活动之间传递信息、收发应用广播、操作后台服务)

启停活动页面 Activity的启动和结束 页面跳转可以使用startActivity接口&#xff0c;具体格式为startActivity(new Intent(this, 目标页面.class));。 关闭一个页面可以直接调用finish();方法即可退出页面。 Activity的生命周期 页面在安卓有个新的名字叫活动&#xff0c;因…

充电机是什么?其技术原理和行业应用

充电机是一种能够为电池充电的设备,通常由一个变压器和整流器组成。变压器将电网中的交流电转换为直流电,而整流器则将直流电转换为稳定的直流电,这种直流电可以被用来给电池充电。 充电机可以分为很多种不同类型,包括输入输出式、输入输出隔离式和车载充电机等。不同类型的充…

Vue2与Vue3实例的深入比较:响应式系统、模板编译和性能分析

I. 响应式系统的差异 A. Vue2的响应式系统 数据劫持&#xff08;Object.defineProperty&#xff09; Vue2的核心响应式机制依赖于JavaScript的Object.defineProperty方法。这个方法允许开发者为对象的属性提供getter和setter&#xff0c;从而实现对属性访问和修改的监控。当…

GoLand 2021.1.3 下载与安装

当前环境&#xff1a;Windows 8.1 x64 1 浏览器打开网站 https://www.jetbrains.com/go/download/other.html 找到 2021.1.3 版本。 2 解压 goland-2021.1.3.win.zip 到 goland-2021.1.3.win。 3 打开 bin 目录下的 goland64.exe&#xff0c;选择 Evaluate for free -- Evalu…

论文解读-面向高效生成大语言模型服务:从算法到系统综述

一、简要介绍 在快速发展的人工智能&#xff08;AI&#xff09;领域中&#xff0c;生成式大型语言模型&#xff08;llm&#xff09;站在了最前沿&#xff0c;彻底改变了论文与数据交互的方式。然而&#xff0c;部署这些模型的计算强度和内存消耗在服务效率方面带来了重大挑战&a…

Linux CentOS 7 服务器集群硬件常用查看命令

&#xff08;一&#xff09;查看内核&#xff1a;uname -a [rootcdh1 ~]# uname -a Linux cdh1.macro.com 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux&#xff08;二&#xff09;查看系统&#xff1a;cat /etc/redhat-releas…

react-创建组件的两种方式

一、函数式组件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>hello_react</title> </he…

ABS8-ASEMI新能源专用整流桥ABS8

编辑&#xff1a;ll ABS8-ASEMI新能源专用整流桥ABS8 型号&#xff1a;KBL410 品牌&#xff1a;ASEMI 封装&#xff1a;ABS-4 最大重复峰值反向电压&#xff1a;800V 最大正向平均整流电流(Vdss)&#xff1a;1A 功率(Pd)&#xff1a;小功率 芯片个数&#xff1a;4 引脚…

夜神、雷电、android studio手机模拟器资源占用情况

夜神、雷电、android studio手机模拟器内存资源占用情况 由于开发电脑只有16G内存&#xff0c;出于开发需要和本身硬件资源的限制&#xff0c;对多个手机模拟器进行了机器资源占用&#xff08;主要是内存&#xff09;的简单比较。 比较的模拟器包括&#xff1a; 1. Android S…

vue2知识点————(vue插槽,透传 Attributes )

vue 插槽 插槽&#xff08;slot&#xff09;是一种强大的特性&#xff0c;允许在组件的模板中定义带有特定用途的“插槽”&#xff0c;然后在组件的使用者中填充内容。插槽能够使组件更加灵活&#xff0c;让组件的结构更容易复用和定 具名插槽&#xff08;Named Slots&#x…

PHP利用phpmailer实现邮件发送功能

要在PHP中实现发送邮件验证码的功能,你需要使用一些特定的库来帮助你处理邮件发送的任务。PHPMailer是一个常用的库,它可以帮助你轻松地发送电子邮件。 以下是一个简单的例子,展示了如何使用PHPMailer库来发送包含验证码的电子邮件: 首先,你需要安装PHPMailer库。你可以通…

微信小程序有的机型无法播放m3u8格式的直播流,使用H5在微信环境里播放

我这测试鸿蒙的还有苹果X及部分机型在微信小程序里无法播放&#xff0c;不知道什么原因&#xff1b; 直播流地址有的是hevc有的是h.264&#xff0c;音频都是aac&#xff1b; <head><meta charset"UTF-8"><title>前端播放m3u8格式视频</title&g…