使用多线程模拟龟兔赛跑,兔子由于睡觉而输掉比赛,乌龟赢得比赛,设兔子每一秒跑两米,乌龟每一秒跑一米,兔子跑到80米,睡了10秒钟,然后接着跑。
注意:
1.判断兔子赢还是乌龟赢,可以用System.currentTimeMillis()方法获取当前系统时间毫秒值(1min = 1000),然后用跑完时间-开始时间,谁的时间短,谁就取得胜利。
2.巧用flag标记兔子是否睡着,设没睡着为true,睡了后将true改为false。
3.sleep()方法有异常,需要处理,可以try-catch,也可以throws
4.巧用Thread的join()方法,因为判断是兔子赢还是乌龟赢,是在main线程中输出,也就是有兔子,乌龟,主线程三个线程,有可能是main线程先执行,也就会还没开始比赛,就显示乌龟取得胜利,所以要用join(),使兔子、乌龟线程插队执行完了后,再判断谁取得胜利。join() 同样要处理异常。
直接上代码:
首先是兔子线程:
public class RabbitThread extends Thread{
private static long time; //耗时
public static long getTime() {
return time;
}
@Override
public void run() {
long startTime = System.currentTimeMillis(); //开始时间毫秒值
int s=0;
boolean flag=true;//没有睡
while (s<=100){
try {
if ( s>=80 && flag) {
flag=false;
System.out.println("兔子睡着了!");
Thread.sleep(10000);
}
System.out.println("兔子跑了"+s+"米");
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
s=s+2;
}
long endTime = System.currentTimeMillis(); //结束时间
time=endTime-startTime;
System.out.println("兔子耗时:"+time/1000+"秒");
}
}
然后是乌龟线程:
public class TurtleThread extends Thread{
private static long time;
public static long getTime() {
return time;
}
@Override
public void run() {
long startTime = System.currentTimeMillis();
int s=0;
while (s<=100){
try {
System.out.println("乌龟跑了"+s+"米");
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
s++;
}
long endTime = System.currentTimeMillis();
time = endTime -startTime;
System.out.println("乌龟跑完了,耗时:"+time/1000+"秒");
}
}
主程序:
public class ThreadTest {
public static void main(String[] args) {
TurtleThread tte = new TurtleThread();
RabbitThread trt= new RabbitThread();
tte.start();
trt.start();
try {
tte.join();
trt.join();//tte和trt插队,因为要等兔子和乌龟比赛结束之后,才来判断谁胜利了
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
//获取main线程对象
Thread.currentThread().yield();
//比赛结果,等兔子与乌龟跑完之后,才来统计, main线程等待tte线程,trt线程完成之后,才执行
long time1 =RabbitThread.getTime(); //获取兔子耗时
long time2 =TurtleThread.getTime(); //获取乌龟耗时
if(time1<time2)
System.out.println("兔子胜利");
else
System.out.println("乌龟胜利");
}
}
运行结果: