美文网首页Java全栈从入门到放弃
Java多线程——龟兔赛跑

Java多线程——龟兔赛跑

作者: _Lucifer丶 | 来源:发表于2017-08-09 17:48 被阅读0次

    -_- 学java快有一个月了,之前一直有记录自己学习过程的想法,但是太懒了所以......
    今天进入线程学习的部分了,老师说是最最最最难的,所以还是记录一下吧~~

    从今天的作业说起

    一、题目:
    实现龟兔赛跑
    提示:可以采用Math.random()取得0~1之间的随机数模拟比赛进程, 如总距离为100米,在随机数00.3之间代表兔子跑,每次跑2米,在0.31之间代表乌龟跑,每次跑1 米,先跑完100米者为胜利者
    结构:
    Race类:产生RabbitAndTurtle的两个实例,分别代表兔子和乌龟
    RabbitAndTurtle类:继承Thread类,实现赛跑的逻辑

    二、个人分析
    拿到题目之后必要容易想到的是整个 题目的大概框架

    1、RabbitAndTurtle类
    //RabbitAndTurtle类继承Thread类实现多线程
    public class RabbitAndTurtle extends Thread {
        //跑道长度
        public int distance = 100;
        //重写run方法
        @Override
        public void run() {
            //题目中提到的Math.random()方法,一开始我还没想到怎么用,先摆在这里
            double ran = Math.random();
            //先测试一下输出结果
            for (; distance > 0; distance--) {
                String name = Thread.currentThread().getName();
                System.out.println(name+" ");       
            }
        }
    }
    2、Race类
    public class Race {
        public static void main(String[] args) {
            //产生RabbitAndTurtle的两个实例,分别代表兔子和乌龟
            Thread rabbit = new RabbitAndTurtle();
            Thread turtle = new RabbitAndTurtle();
            //setName()方法起名字
            rabbit.setName("小白兔子");
            turtle.setName("乌龟");
            //启动线程      
            rabbit.start();
            turtle.start();
        }
    }
    

    ok,写到这里程序的大致的内容已经差不多了,剩下的就是实现具体的run方法中的逻辑,我们先看一下有木有什么错误。

    运行结果


    运行结果

    可以看到两个线程是随机交替进行的,接下来细化run方法

    //补充几个属性
    //跑道长度
    public int distance = 100;
    //不满足条件(如跑到了终点)结束线程
    static boolean flag = true;
    //已经跑了的长度
    public int predistance = 0;
    @Override
    public void run() {
        //还是不知道怎么用的随机数-_-       
        double ran = Math.random();
        //获得当前线程名字
        String name = Thread.currentThread().getName();
        //进行循环立一个flag作为循环条件~~~
        while(flag){
        //我也不知道为什么要先sleep()一下-_-,原谅我很渣
        //但是看到有小伙伴这么说:
        //java多线程中,在有睡眠(sleep)时,执行顺序是抢占式的。
        //也就是说,执行不是按固有的顺序来的,而是谁抢先占据到内存空间,谁就先运行。
        //但是!老师说JVM默认的轮换调度就是抢占啊~~~~此处先留一个小疑问吧
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //还是搞不懂提示中的随机数,不是直接匹配名字就好了么-_-
            //明天讲了这一题再来纠结这个问题
            //如果当前线程为乌龟,一次前进一米
            if(name.equals("乌龟") && predistance!=100){
                predistance += 1;
                System.out.println(name + "我跑了:" + predistance + "米");
                if(predistance == 100){
                    System.out.println("=================乌龟赢了=================");
                    //立的flag在此处起作用,跑到100m了flag置为false不再进行循环
                    flag = false;
                }
            }
            //如果当前线程为兔子,一次前进两米
            if(name.equals("小白兔子")&& predistance!=100){
                predistance += 2;
                System.out.println(name + "我跑了:" + predistance + "米");
                if(predistance == 100){
                    System.out.println("=================小白兔子赢了=================");
                    //立的flag在此处起作用,跑到100m了flag置为false不再进行循环
                    flag = false;
                }
            }
        }   
    }
    

    激动人心的时候到了!!
    让我们看一下运行结果~~~

    运行结果
    运行结果

    基本符合题目要求|・ω・`),还是有一点开心的
    但是!!!
    最后一行是什么鬼!
    我不管我不管我不管,看不见看不见看不见-_-
    不是我的逻辑有问题!!

    (´ཀ`」 ∠)_改了半天还是没改对
    还是明天听讲解吧(๑‾ ꇴ ‾๑)
    关于题目就写到这里

    对了,我是一只萌新~~~~
    欢迎各路大神指教,也欢迎一起学习的小伙伴互相讨论
    对于文章中措辞或者逻辑捉急的地方欢迎大家指正
    虽然怀疑有没有人会看到这篇文章 但还是写了很多~
    我爱学习学习使我快乐

    我爱学习学习使我快乐

    相关文章

      网友评论

        本文标题:Java多线程——龟兔赛跑

        本文链接:https://www.haomeiwen.com/subject/asrqrxtx.html