Java多线程-龟兔赛跑
学习java已经过了两个月了,之前一直有想记录学习情况的想法,但是由于太懒,自身语言组织能力差又放弃了,现在java学到线程这块,今天是学习的线程第一天,还是觉得应该尝试一下写写博客来提升自我。第一篇博客就从龟兔赛跑这个题目开始记录吧,这也是今天的作业,让我们先来看看题目需求吧。
题目: 实现龟兔赛跑
提示:可以采用Math.random()取得0~1之间的随机数模拟比赛进程, 如总距离为100米,在随机数0~0.3之间代表兔子跑,
每次跑2米,在0.3~1之间代表乌龟跑,每次跑1米, 先跑完100米者为胜利者
Race类:产生RabbitAndTurtle的两个实例,分别代表兔子和乌龟
RabbitAndTurtle类:继承Thread类,实现赛跑的逻辑
很快我把代码写好一部分,但当我想加入随机数判定的时候却发现,只知道如何知道当前线程的名字,具体的逻辑却发现不知道如果“暂停”另外一个线程。emmm,这是我最初一开始的想法。所以我索性不写,直接先实现线程通过自己的资源抢占,来看谁先执行,到达终点。
//RabbitAndTurtlr类的实现
//继承Thread类
public class RabbitAndTurtle extends Thread {
//对于run方法的重写
@Override
public void run() {
//设置起点
int rdistance = 0;
int tdistance = 0;
boolean flag = true;
//暂时不会用
double math = Math.random();
//当满足兔子/乌龟到达终点就跳出循环
while(flag){
if(rdistance!=100&&tdistance!=100) {
String name = Thread.currentThread().getName();
if("乌龟".equals(name)&&tdistance!=100) {
tdistance+=1;
System.out.println(name+"已经跑了"+tdistance+"米");
}
if("兔子".equals(name)&&rdistance!=100) {
rdistance+=2;
System.out.println(name+"已经跑了"+rdistance+"米");
}
}
if(rdistance==100) {
System.out.println("兔子先到达了终点");
flag = false;
}
if(tdistance==100) {
System.out.println("乌龟先到达了终点");
flag = false;
}
}
}
}
public class Race{
public static void main(String[] args){
Thread rabbit = new RabbitAndTurtle();
Thread turtle = new RabbitAndTurtle();
Rabbit.setName("兔子");
Turtle.setName("乌龟");
Rabbit.start();
Turtle.start();
}
}
运行结果如下:
通过对结果的分析,可以看出,对于线程的了解,误以为线程都在执行一个run方法,其实两个线程除了抢占资源互不相干,执行起来两者基本没有联系,所以从结果可以看出,当兔子到达终点的时候,乌龟那个线程仍然在跑,结果是不对的。
经过一番思考和跟老师的询问终于懂其中错误,第一,对于while语句的循环,显然flag不应该放在run方法里,同时应该设置flag为静态属性(静态变量是所有对象共享的一个变量,也就是说当一个线程,比如龟线程到重点,那么他就会把flag改变,那么,兔线程同样也会知道这样的改变。但是如果是非静态变量flag,那么龟线程即使改变了flag,那么兔线程的flag也是不会变的)。第二,随机数的语句可以放进判断当前线程的if语句中(做作业做傻了,这都没想到…),调整以后的代码如下:
public class RabbitAndTurtle extends Thread {
// 代表比赛的状态
public static boolean flag = true;
// 代表跑的距离
public int distance;
@Override
public void run() {
while(flag) {
double random = Math.random();
if(random<=0.3&&"兔子".equals(this.getName())) {
distance +=2;
System.out.println("兔子已经跑了"+distance+"米");
}
if(random>0.3&&"乌龟".equals(this.getName())) {
distance +=1;
System.out.println("乌龟已经跑了"+distance+"米");
}
if(this.distance==100) {
System.out.println("恭喜"+this.getName()+"获得冠军");
flag=false;
}
}
}
}
public class Race {
public static void main(String[] args) {
RabbitAndTurtle turtle = new RabbitAndTurtle();
turtle.setName("乌龟");
turtle.start();
RabbitAndTurtle rabbit = new RabbitAndTurtle();
rabbit.setName("兔子");
rabbit.start();
}
}
运行结果如下:
上一篇: 如何与人相处的小技巧
下一篇: Centos7.5系统下SSH用法及命令