首先是需求:
1. 用两个线程分别模拟乌龟和兔子奔跑。兔子和乌龟的速度不同。
2. 两个线程共同跑完总长1000米。
3. 同一时间只能有一个在跑,另一个处于休息状态。(兔子和乌龟严格轮流交替跑)
4. 当总长度跑完以后,两个线程结束。
5. 当两个线程都结束后,打印"到达终点"。
6. 分别输出乌龟和兔子奔跑的距离。
分析:
1.首先需要确定使用什么方式创建线程,这里我们选用实现Runnable接口方式进行创建线程,因为这种方式的好处很多。【题外话】具体的可以参考这篇文章,可以让你对创建线程的三种方式有一定认识。也有助于了解这次代码的写法。滨少:创建线程的三种方式及Thread源码解析zhuanlan.zhihu.com
2.读完需求后,我们知道必须有三个变量:一个用于存储总距离1000米,一个用于存储乌龟跑的距离,一个用于存储兔子跑的距离。
3.是两个线程在抢一个资源,并且是严格的交替跑,所以我的想法是将公共资源1000米单独定义在一个Race类中,通过在Rannable实现类中创建构造方法,将Race类对象当做构造方法的参数。在运行类中,创建方法时传入 同一个Race对象,这样就实现了两个线程争抢同一个资源。
4.强制交替跑,这里用到了notify方法跟wait方法。锁的方式我没试过,有兴趣的可以用锁尝试实现一下。
话不多说,上代码。我不是什么大佬,就是一个初学java的小白。所以有写的不好的地方,或伤及池鱼,请大家多多包涵指正。
一共包括四个类,一个乌龟类,一个兔子类,一个赛跑(race类),一个运行类。
Race类:该类作用是提供公共资源1000米,提供pao方法用于表示兔子,乌龟跑的距离。
public
乌龟类:该类的作用是提供一个带参构造,参数是Race类型的参数,这样是为了实现了两个线程争抢一个资源的需求。另外受Thread源码的启发,在乌龟类中我的run方法是不做事的,做事的是Race类中pao()方法。
public
兔子类:兔子类跟乌龟类是一样的,同样将创建对象时传入了一个Race类型的对象。
public
运行主类:该类的作用是创建一个公共资源对象race,创建龟兔两个线程都传入race对象,让两个线程“跑的是统一段路”
public class RaceDemo {
public static void main(String[] args) throws Exception {
Race race = new Race();
WuGui wg = new WuGui(race);
TuZi tz = new TuZi(race);
Thread w = new Thread(wg, "乌龟");
Thread t = new Thread(tz, "兔子");
w.start();
t.start();
}
}
运行结果:如果你运行后的结果是这,恭喜你完成了这个练习,撒个花。
