多线程编程实验报告,求Java代码,跟运行结果截图,Java实验报告
3条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-05-23 20:41关注
晚上好🌙🌙🌙
本答案参考ChatGPT-3.5实验五多线程编程
一、实验目的
1.掌握线程类的定义和使用方法; 2.能够解决线程调度、线程同步等问题; 3.能够选择使用合适的线程类和接口设计多线程程序完成相关操作,解决特定问题。
二、课程目标
支撑课程目标(4):了解Java开发主流平台、工具的特点、使用方法和局限性,能够借助DE等工具完成程序的调试、测试,敢于质疑,具有实践验证、评价优化的能力,体现软件质量意识。
三、实验任务
- 学校运动会就要到了。每个运动员取得不同名次后将获得相应的分值,学校奖按照各学院所有运动员总分对所有学院进行排名。编程模拟软件学院10个运动员在比赛中对学院总分的贡献。每个运动员获得的分值在0~5分之间随机产生。定义1个运动员线程,能够增加学院总分,设学院总分初始为0。输出样例(共10行):
运动员1贡献1分,目前学院总分为1分 运动员3贡献2分,目前学院总分为3分 运动员2贡献5分,目前学院总分为8分 运动员8贡献0分,目前学院总分为8分 运动员7贡献4分,目前学院总分为32分
解决方案:
- 首先定义一个学院类,里面包括学院名称和学院总分两个属性。
- 然后定义一个运动员类,包括运动员名称和获得的分数两个属性,以及一个增加学院分数的方法。
- 在主函数中创建10个运动员类的对象,每个对象随机生成分数,然后调用增加学院分数的方法,同时输出结果。
Java 代码:
import java.util.Random; class School { private String name; private int score; public School(String name, int score) { this.name = name; this.score = score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } } class Athlete implements Runnable { private String name; private int score; private School school; public Athlete(String name, School school) { this.name = name; this.school = school; this.score = new Random().nextInt(6); } public String getName() { return name; } public int getScore() { return score; } public void addScore() { school.setScore(school.getScore() + score); System.out.println(name + "贡献" + score + "分,目前" + school.getName() + "总分为" + school.getScore() + "分"); } @Override public void run() { addScore(); } } public class Main { public static void main(String[] args) { School software = new School("软件学院", 0); for (int i = 1; i <= 10; i++) { new Thread(new Athlete("运动员" + i, software)).start(); } } }
2.为提高效率,某工厂配备了机器人搬运货物。请定义一个机器人Robot线程类,模拟m个机器人搬运size件货物。要求:
- 货物按顺序搬运,搬完为止;
- 输入两个整数,第一个是货物数量size,第二个是机器人数量m。
输入样例:103
输出搬运过程,包括机器人编号(1~m)和搬运的货物编号(1~size)。
输出样例:
Robot1已搬运:货物0 Robot2已搬运:货物1 Robot3已搬运:货物2 Robot3已搬运:货物3 Robot2已搬运:货物4 ...
解决方案:
- 首先定义一个机器人类,类包括一个编号属性。
- 在主函数中定义一个数组存放货物,然后创建m个机器人类的对象,每个机器人通过对货物数组的遍历把指定编号的货物搬运。
- 由于是多线程操作,需要对货物的编号进行同步操作。
Java 代码:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Robot implements Runnable { private int num; public Robot(int num) { this.num = num; } @Override public void run() { for (int i = 0; i < Main.size; i++) { Main.lock.lock(); try { if (Main.current < Main.size && Main.goods[Main.current] == i) { System.out.println("Robot" + num + "已搬运:货物" + Main.current); Main.current++; } } finally { Main.lock.unlock(); } } } } public class Main { public static int size = 103; public static volatile int current = 0; public static Lock lock = new ReentrantLock(); public static int[] goods = new int[size]; public static void main(String[] args) { for (int i = 0; i < size; i++) { goods[i] = i % 3 == 0 ? i : -1; } int m = 3; for (int i = 1; i <= m; i++) { new Thread(new Robot(i)).start(); } } }
3.团结就是力量。一年级小学生已经学会了100以内加法,现在老师要求计算1~100的和,4个小朋友决定分工合作,每人求出25个数的和,第一个小朋友从1加到25,第二个小朋友从26加到50,第三个小朋友从51加到75,第四个小朋友从76加到100,然后把4个和加起来。
请编程模拟这个过程,要求输出信息包括:
- 每个小朋友的编号(1~4);
- 每个小朋友的计算结果;
- 最终计算结果。
输出样例:
1计算的结果为325 2计算的结果为950 3计算的结果为1575 4计算的结果为2300 总计算结果为5150
解决方案:
- 定义一个线程类,类中包含编号(1~4),加法计算的范围(起始加数和终止加数)和加法结果三个属性。
- 在主函数中创建4个线程对象,把任务分配给不同的线程进行计算,最后把计算结果相加。
Java 代码:
class Sum implements Runnable { private int num; private int start; private int end; private int result; public Sum(int num, int start, int end) { this.num = num; this.start = start; this.end = end; } public int getResult() { return result; } @Override public void run() { for (int i = start; i <= end; i++) { result += i; } System.out.println(num + "计算的结果为" + result); } } public class Main { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new Sum(1, 1, 25)); Thread t2 = new Thread(new Sum(2, 26, 50)); Thread t3 = new Thread(new Sum(3, 51, 75)); Thread t4 = new Thread(new Sum(4, 76, 100)); t1.start(); t2.start(); t3.start(); t4.start(); t1.join(); t2.join(); t3.join(); t4.join(); int result = t1.isAlive() ? 0 : ((Sum) t1.getRunnable()).getResult(); result += t2.isAlive() ? 0 : ((Sum) t2.getRunnable()).getResult(); result += t3.isAlive() ? 0 : ((Sum) t3.getRunnable()).getResult(); result += t4.isAlive() ? 0 : ((Sum) t4.getRunnable()).getResult(); System.out.println("总计算结果为" + result); } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 from seleniumwire import webdriver 在抓取http://链接的时候会自动转https://这个怎么解决
- ¥15 BAT根据上两级文件夹重新命名文件要求BAT
- ¥15 hive直连数据库模式插入mysql表数据失败(相关搜索:数据库)
- ¥30 不会,学习,有偿解答
- ¥15 SQL查询语句报错(检查)
- ¥15 此表中公式应该怎么写
- ¥15 求HI-TECH PICC 9.50 PL3安装包
- ¥15 下载ctorch报错,求解
- ¥15 如何入门学习c语言,单片机
- ¥15 idea 编辑语言的选择