• JAVA第十次作业


    一、作业要求

    (一)学习总结

    1.用思维导图对java多线程的学习内容进行总结。

    2.下面是一个单线程实现的龟兔赛跑游戏。

    public class TortoiseHareRace {
    public static void main(String[] args) {
        int totalStep = 10;
        int tortoiseStep = 0;
        int hareStep = 0;
        boolean[] flags = {true,false};
        System.out.println("龟兔赛跑开始了...");
        while(tortoiseStep < totalStep && hareStep < totalStep){
            tortoiseStep++;
            System.out.println("乌龟跑了"+tortoiseStep+"步...");
            boolean isHareSleep = flags[((int)(Math.random()*10))%2];
            if(isHareSleep){
                System.out.println("兔子睡着了zzzz");
            }else{
                hareStep += 2;
                System.out.println("兔子跑了"+hareStep+"步...");
            }
        }       
    }
    }
    

    阅读程序,采用实现Runnable接口的方式用多线程实现这个小游戏。下面给出主线程类,补充Tortoise线程类和Hare线程类。

    public class TortoiseHareRace { 
    public static void main(String[] args) {
        Tortoise tortoise = new Tortoise(10);
        Hare hare = new Hare(10);
        Thread tortoiseThread = new Thread(tortoise);
        Thread hareThread = new Thread(hare);
        tortoiseThread.start();
        hareThread.start();
    }
    }
    

    Tortoise线程类:

    package a;
    public class Tortoise implements Runnable {
         private int step;
         private int totalstep=10;
         public Tortoise(int step){
             this.step=step;
        }
        public void setStep(int step){
            this.step=step;
        }
        public int getStep(){
            return step;
        }
         public void run(){
             for (step=0;step<=10;step++) {
            synchronized(this){
                 if (step < this.totalstep) {
                        try {
                            Thread.sleep(300);
                            step++;
                            System.out.println("乌龟走了" + step + "步");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    }
    public String toString(){
        return "乌龟步数:"+this.step;
    }
    }
    

    Hare线程类:

    package a;
    public class Hare implements Runnable {
    private int step;
    private int harestep;
    public Hare(int step){
        this.step=step;
    }
    public void setStep(int step){
        this.step=step;
    }
    public int getStep(){
        return step;
    }
    public String toString(){
        return "兔子步数:"+this.step;
    }
    public void run() {
         boolean[] flags = { true, false };
         for(step=0;step<=10;step++)
         {
             synchronized(this){
                 while (harestep < step) {
                        boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
                        if (isHareSleep) {
                            System.out.println("兔子睡着了zzzz");
                        } else {
                            harestep += 2;
                            System.out.println("兔子跑了" + harestep + "步...");
                        }
                    }
                }
             }
         }
    }    
    

    3.下面的程序是模拟了生产者——消费者问题,生产者生产10个数,消费者依次消费10个数,运行程序,看结果是否正常?存在什么问题?说明原因。使用synchronized, wait, notify解决程序出现的问题。写出修改的部分程序即可。

    class Consumer implements Runnable {
    private Clerk clerk;
    public Consumer(Clerk clerk) {
        this.clerk = clerk;
    }
    public void run() {
        System.out.println("消费者开始消耗整数......");
        // 消耗10个整数
        for(int i = 1; i <= 10; i++) {
            try {
                 // 等待随机时间
                Thread.sleep((int) (Math.random() * 3000));
            }
            catch(InterruptedException e) {
                e.printStackTrace();
            }              
            clerk.getProduct();// 从店员处取走整数
        }
    }
    }
    class Producer implements Runnable {
    private Clerk clerk;
    public Producer(Clerk clerk) {
        this.clerk = clerk;
    }
    public void run() {
        System.out.println( "生产者开始生产整数......");
        // 生产1到10的整数
        for(int product = 1; product <= 10; product++) {
            try {
                Thread.sleep((int) Math.random() * 3000);
            }
            catch(InterruptedException e) {
                e.printStackTrace();
            }
           clerk.setProduct(product); // 将产品交给店员
        }
    } 
    }
    public class ProductTest {
    public static void main(String[] args) {
        Clerk clerk = new Clerk();
        Thread consumerThread = new Thread(new Consumer(clerk)); 
        Thread producerThread = new Thread(new Producer(clerk)); 
        consumerThread.start(); 
        producerThread.start(); 
    }
    }
    class Clerk {
    private int product = -1; // -1 表示目前没有产品 
     // 这个方法由生产者呼叫
    public void setProduct(int product) {
        this.product = product; 
        System.out.printf("生产者设定 (%d)%n", this.product);      
    } 
    // 这个方法由消费者呼叫
    public int getProduct() {          
        int p = this.product; 
        System.out.printf("消费者取走 (%d)%n", this.product);      
        return p; 
    } 
    }
    

    没有进行代码同步和唤醒。
    运行结果为:

    修改后的为:

    class Clerk {
    private int product = -1; // -1 表示目前没有产品
    private int p ;
    // 这个方法由生产者呼叫
    public synchronized void setProduct(int product) {
        if (this.product != -1) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.product = product;
        p = this.product;
        System.out.printf("生产者设定 (%d)%n", this.product);
        getProduct();
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.product = -1;
        super.notify();
    }
    // 这个方法由消费者呼叫
    public synchronized int getProduct() {
        if (this.product == -1) {
            try {
                wait();
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
         try {
             Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("消费者取走 (%d)%n", p);
        this.product = -1;
        super.notify();
        return this.product;
    }
    }
    

    运行结果为:
    生产者开始生产整数......
    消费者开始消耗整数......
    生产者设定 (1)
    消费者取走 (1)
    生产者设定 (2)
    消费者取走 (2)
    生产者设定 (3)
    消费者取走 (3)
    生产者设定 (4)
    消费者取走 (4)
    生产者设定 (5)
    消费者取走 (5)
    生产者设定 (6)
    消费者取走 (6)
    消费者取走 (6)
    生产者设定 (7)
    消费者取走 (7)
    生产者设定 (8)
    消费者取走 (8)
    生产者设定 (9)
    消费者取走 (9)
    生产者设定 (10)
    消费者取走 (10)

    4.其他需要总结的内容。
    最后一次实验作业,慢慢的也知道到了学习的方法和总结的方法,也对java有了一定的了解。作业结束,学习继续。

    (二)实验总结

    实验内容:

    1.模拟三个老师同时分发80分作业,每个老师相当于一个线程。

    2.模拟一个银行存款的程序。假设有两个储户都去银行往同一个账户进行存款,一次存100,每人存三次。要求储户每存一次钱,账户余额增加100,并在控制台输出当前账户的余额。

    完成实验内容,代码上传到码云,对完成实验内容过程中遇到的问题、解决方案和思考等进行归纳总结,注意代码中必须有必要的注释。
    格式如下:
    (一)程序设计思路:实现Teacher和Task两个类的Runnable接口。80份作业,创建一个对象,共享一个目标对象。
    (二)程序设计思路:用Bank类和User类并把用户类实现Runnable类接口。

    (三)代码托管(务必链接到你的项目)

    码云commit历史截图

    上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图。

  • 相关阅读:
    java8特性 Optional 工具类
    SpringBoot 配置支付宝接口
    Redis宕机 快速恢复
    flowable流程引擎通过模型ID部署流程
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Mybatis 动态执行SQL语句
    idea 访问 jsp 404问题
    变量名的命名
    CSS设计 Search窗口
    jQuery实现Ajax功能示例
  • 原文地址:https://www.cnblogs.com/lchang-9/p/6935712.html
Copyright © 2020-2023  润新知