%ddd 2024-05-23 20:40 采纳率: 86.7%
浏览 8
已结题

多线程编程实验报告Java

多线程编程实验报告,求Java代码,跟运行结果截图,Java实验报告

img

  • 写回答

3条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    实验五多线程编程

    一、实验目的

    1.掌握线程类的定义和使用方法; 2.能够解决线程调度、线程同步等问题; 3.能够选择使用合适的线程类和接口设计多线程程序完成相关操作,解决特定问题。

    二、课程目标

    支撑课程目标(4):了解Java开发主流平台、工具的特点、使用方法和局限性,能够借助DE等工具完成程序的调试、测试,敢于质疑,具有实践验证、评价优化的能力,体现软件质量意识。

    三、实验任务

    1. 学校运动会就要到了。每个运动员取得不同名次后将获得相应的分值,学校奖按照各学院所有运动员总分对所有学院进行排名。编程模拟软件学院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);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月23日

悬赏问题

  • ¥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 编辑语言的选择