使用多线程模拟龟兔赛跑问题

文章通过创建两个线程,RabbitThread(兔子)和TurtleThread(乌龟),模拟龟兔赛跑。兔子在跑到80米时睡了10秒,乌龟则一直持续跑步。使用System.currentTimeMillis()记录开始和结束时间,以及Thread.sleep()实现延迟。主程序通过join()方法确保兔子和乌龟线程执行完毕后再进行胜负判断。最终根据耗时决定乌龟或兔子获胜。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用多线程模拟龟兔赛跑,兔子由于睡觉而输掉比赛,乌龟赢得比赛,设兔子每一秒跑两米,乌龟每一秒跑一米,兔子跑到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("乌龟胜利");
    }
}

运行结果: 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值