请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

2、龟兔赛跑

Animal类

package com.imooc.chapter16test;

import java.util.Random;

public class Animal implements Runnable{
    private final int RACE_DISTANCE = 100; //100米的赛跑距离

    //使用共享标志(volatile 变量)通知其他线程结束
    private static volatile  boolean raceFinished = false;
    private String name; //选手姓名
    private final Random random = new Random();
    private int distance; //每位选手初始跑的距离

    //含参构造方法
    public Animal(String name,int distance) {
        this.name = name;
        this.distance = distance;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    //重写父类对象
    @Override
    public void run() {
        while( distance < RACE_DISTANCE){
            distance++;
            System.out.printf("%s 跑了 %d 米%n", name,distance);
            //检查是否比赛已经结束
            if (distance >= RACE_DISTANCE){
                synchronized (this){
                    if(!raceFinished){ 
                    //如果比赛已经结束但是共享标志还是false改为true,通知另一个线程结束
                        raceFinished = true;
                        System.out.println("--------比赛结束-------");
                        System.out.println("冠军是: " + name);
                    }
                }
            }
            try {
                Thread.sleep(random.nextInt(11));//每位选手休息1-10毫秒
                //如果选手是兔子且跑了10米并且兔子尚未完赛
                if (name.equals("兔子") && distance % 10 == 0 && distance < RACE_DISTANCE) {
                    System.out.printf("%s 跑了10米,休息200ms%n", name);
                    Thread.sleep(200);
                }
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

实现类

package com.imooc.chapter16test;

import com.sun.org.glassfish.gmbal.AMXClient;

public class HareTortoiseTest {
    public static void main(String[] args) throws InterruptedException {
        //创建乌龟和兔子的实例对象
        Animal hare = new Animal("兔子",0);
        Animal tortoise = new Animal("乌龟",0);

        //创建Thread实例对象,并把兔子和乌龟的子类对象传参
        Thread thread1 = new Thread(hare);
        Thread thread2 = new Thread(tortoise);

        //启动线程
        thread1.start();
        thread2.start();
    }
}

读了文档看到可以使用共享标志(volatile 变量)通知其他线程结束,但是代码输出兔子线程跑完了才会结束,还请彭彭老师指出代码中的缺陷,不胜感激!

输出结果
兔子 跑了 1 米
乌龟 跑了 1 米
兔子 跑了 2 米
兔子 跑了 3 米
乌龟 跑了 2 米
乌龟 跑了 3 米
兔子 跑了 4 米
乌龟 跑了 4 米
乌龟 跑了 5 米
兔子 跑了 5 米
兔子 跑了 6 米
乌龟 跑了 6 米
兔子 跑了 7 米
乌龟 跑了 7 米
兔子 跑了 8 米
乌龟 跑了 8 米
兔子 跑了 9 米
乌龟 跑了 9 米
兔子 跑了 10 米
乌龟 跑了 10 米
兔子 跑了10米,休息200ms
乌龟 跑了 11 米
乌龟 跑了 12 米
乌龟 跑了 13 米
乌龟 跑了 14 米
乌龟 跑了 15 米
乌龟 跑了 16 米
乌龟 跑了 17 米
乌龟 跑了 18 米
乌龟 跑了 19 米
乌龟 跑了 20 米
乌龟 跑了 21 米
乌龟 跑了 22 米
乌龟 跑了 23 米
乌龟 跑了 24 米
乌龟 跑了 25 米
乌龟 跑了 26 米
乌龟 跑了 27 米
乌龟 跑了 28 米
乌龟 跑了 29 米
乌龟 跑了 30 米
乌龟 跑了 31 米
乌龟 跑了 32 米
乌龟 跑了 33 米
乌龟 跑了 34 米
乌龟 跑了 35 米
乌龟 跑了 36 米
乌龟 跑了 37 米
乌龟 跑了 38 米
兔子 跑了 11 米
乌龟 跑了 39 米
兔子 跑了 12 米
乌龟 跑了 40 米
兔子 跑了 13 米
兔子 跑了 14 米
乌龟 跑了 41 米
兔子 跑了 15 米
乌龟 跑了 42 米
兔子 跑了 16 米
乌龟 跑了 43 米
乌龟 跑了 44 米
兔子 跑了 17 米
乌龟 跑了 45 米
乌龟 跑了 46 米
兔子 跑了 18 米
乌龟 跑了 47 米
乌龟 跑了 48 米
乌龟 跑了 49 米
兔子 跑了 19 米
乌龟 跑了 50 米
乌龟 跑了 51 米
兔子 跑了 20 米
兔子 跑了10米,休息200ms
乌龟 跑了 52 米
乌龟 跑了 53 米
乌龟 跑了 54 米
乌龟 跑了 55 米
乌龟 跑了 56 米
乌龟 跑了 57 米
乌龟 跑了 58 米
乌龟 跑了 59 米
乌龟 跑了 60 米
乌龟 跑了 61 米
乌龟 跑了 62 米
乌龟 跑了 63 米
乌龟 跑了 64 米
乌龟 跑了 65 米
乌龟 跑了 66 米
乌龟 跑了 67 米
乌龟 跑了 68 米
乌龟 跑了 69 米
乌龟 跑了 70 米
乌龟 跑了 71 米
乌龟 跑了 72 米
乌龟 跑了 73 米
乌龟 跑了 74 米
乌龟 跑了 75 米
乌龟 跑了 76 米
乌龟 跑了 77 米
乌龟 跑了 78 米
乌龟 跑了 79 米
乌龟 跑了 80 米
乌龟 跑了 81 米
乌龟 跑了 82 米
乌龟 跑了 83 米
乌龟 跑了 84 米
兔子 跑了 21 米
乌龟 跑了 85 米
乌龟 跑了 86 米
兔子 跑了 22 米
乌龟 跑了 87 米
兔子 跑了 23 米
兔子 跑了 24 米
乌龟 跑了 88 米
兔子 跑了 25 米
乌龟 跑了 89 米
乌龟 跑了 90 米
乌龟 跑了 91 米
乌龟 跑了 92 米
兔子 跑了 26 米
兔子 跑了 27 米
乌龟 跑了 93 米
乌龟 跑了 94 米
乌龟 跑了 95 米
兔子 跑了 28 米
兔子 跑了 29 米
乌龟 跑了 96 米
兔子 跑了 30 米
兔子 跑了10米,休息200ms
乌龟 跑了 97 米
乌龟 跑了 98 米
乌龟 跑了 99 米
乌龟 跑了 100 米
--------比赛结束-------
冠军是: 乌龟
兔子 跑了 31 米
兔子 跑了 32 米
兔子 跑了 33 米
兔子 跑了 34 米
兔子 跑了 35 米
兔子 跑了 36 米
兔子 跑了 37 米
兔子 跑了 38 米
兔子 跑了 39 米
兔子 跑了 40 米
兔子 跑了10米,休息200ms
兔子 跑了 41 米
兔子 跑了 42 米
兔子 跑了 43 米
兔子 跑了 44 米
兔子 跑了 45 米
兔子 跑了 46 米
兔子 跑了 47 米
兔子 跑了 48 米
兔子 跑了 49 米
兔子 跑了 50 米
兔子 跑了10米,休息200ms
兔子 跑了 51 米
兔子 跑了 52 米
兔子 跑了 53 米
兔子 跑了 54 米
兔子 跑了 55 米
兔子 跑了 56 米
兔子 跑了 57 米
兔子 跑了 58 米
兔子 跑了 59 米
兔子 跑了 60 米
兔子 跑了10米,休息200ms
兔子 跑了 61 米
兔子 跑了 62 米
兔子 跑了 63 米
兔子 跑了 64 米
兔子 跑了 65 米
兔子 跑了 66 米
兔子 跑了 67 米
兔子 跑了 68 米
兔子 跑了 69 米
兔子 跑了 70 米
兔子 跑了10米,休息200ms
兔子 跑了 71 米
兔子 跑了 72 米
兔子 跑了 73 米
兔子 跑了 74 米
兔子 跑了 75 米
兔子 跑了 76 米
兔子 跑了 77 米
兔子 跑了 78 米
兔子 跑了 79 米
兔子 跑了 80 米
兔子 跑了10米,休息200ms
兔子 跑了 81 米
兔子 跑了 82 米
兔子 跑了 83 米
兔子 跑了 84 米
兔子 跑了 85 米
兔子 跑了 86 米
兔子 跑了 87 米
兔子 跑了 88 米
兔子 跑了 89 米
兔子 跑了 90 米
兔子 跑了10米,休息200ms
兔子 跑了 91 米
兔子 跑了 92 米
兔子 跑了 93 米
兔子 跑了 94 米
兔子 跑了 95 米
兔子 跑了 96 米
兔子 跑了 97 米
兔子 跑了 98 米
兔子 跑了 99 米
兔子 跑了 100 米

正在回答 回答被采纳积分+3

1回答

彭彭老师 2025-02-23 13:25:01

比赛结束,raceFinished 为 true

while 循环条件中,对 raceFinished 进行判断,比赛未结束,进行 while 循环,比赛结束,就不再循环了

https://img1.sycdn.imooc.com/szimg/3cdffe6709baaff114240866.jpg

1 回复 有任何疑惑可以回复我~
  • 提问者 mottoyin #1
    昨晚钻牛角尖了,感谢老师
    回复 有任何疑惑可以回复我~ 2025-02-23 14:23:16
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号