Java多线程——龟兔赛跑

原创 2017年08月09日 16:40:49

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

从今天的作业说起

一、题目:
实现龟兔赛跑
提示:可以采用Math.random()取得0~1之间的随机数模拟比赛进程, 如总距离为100米,在随机数0~0.3之间代表兔子跑,每次跑2米,在0.3~1之间代表乌龟跑,每次跑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;
            }
        }
    }   
}

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

这里写图片描述
…….
这里写图片描述

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

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

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

我爱学习~学习使我快乐~

版权声明:本文为博主原创文章,未经博主允许不得转载。

多线程实现——新龟兔赛跑

新龟兔赛跑: 规则:龟兔同时起步,每10毫秒秒跑1米,终点为100米,兔子跑步的能力强,乌龟跑步的能力弱 途中:1.兔子跑到10米的时候,谦让乌龟一下,接着跑 ...
  • Mus_Li
  • Mus_Li
  • 2017年04月23日 13:14
  • 577

龟兔赛跑之Java多线程通讯初识

龟兔赛跑案例,是一个经典的多线程并发的实例。通过这个案例的学习,可以对Java中线程之间通讯有一个初步的认识。...

龟兔赛跑多线程C++程序

  • 2013年04月24日 11:10
  • 2KB
  • 下载

多线程演示龟兔赛跑

  • 2011年12月26日 17:08
  • 1KB
  • 下载

多线程小案例之龟兔赛跑

多线程小案例之龟兔赛跑

JAVA多线程编程实现龟兔赛跑

Java的多线程建立在Thread类和Runnable接口上,可以通过继承Thread类和实现Runnable接口创建一个线程。 实现Runnable接口的类需要实例化run()方法。 实例化Th...
  • vas_sc
  • vas_sc
  • 2015年11月27日 18:46
  • 559

Java多线程龟兔赛跑

  • 2011年05月13日 12:13
  • 1KB
  • 下载

java程序设计中线程的方法回调(龟兔赛跑)

在线程中方法回调,就是在回调的地方实现interface接口下面案例(龟兔赛跑)mian方法类public class Test { public static void main(String...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java多线程——龟兔赛跑
举报原因:
原因补充:

(最多只允许输入30个字)