欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java多线程-龟兔赛跑

程序员文章站 2022-05-02 10:09:30
...

学习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();
	}
}

运行结果如下:
Java多线程-龟兔赛跑
Java多线程-龟兔赛跑
Java多线程-龟兔赛跑
Java多线程-龟兔赛跑
Java多线程-龟兔赛跑
通过对结果的分析,可以看出,对于线程的了解,误以为线程都在执行一个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();
	}
}

运行结果如下:
Java多线程-龟兔赛跑
Java多线程-龟兔赛跑

相关标签: java 多线程