【Java代码】多线程案例-龟兔赛跑

该文章展示了一个使用Java编程实现龟兔赛跑的示例,通过ThreadPoolExecutor线程池管理乌龟和兔子两个线程。乌龟速度为1米/1000毫秒,兔子速度为1.2米/1000毫秒,兔子在跑到60米时会休息120秒。最终由于兔子休息,乌龟赢得了比赛。
摘要由CSDN通过智能技术生成

原题大概如下:

用java实现以下要求,编写一个程序模拟龟兔赛跑,乌龟的速度为1米/1000毫秒。兔子的速度为1.2米/1000毫秒

可以用到以下知识点:

ThreadPoolExecutor有四个构造器,它们的参数分别是:

  • int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue
  • int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory
  • int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler
  • int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler

这些参数的含义是:

  • corePoolSize:核心线程数,即线程池中始终保持的线程数量,即使它们是空闲的。
  • maximumPoolSize:最大线程数,即线程池中能够容纳的最多线程数量。
  • keepAliveTime:空闲线程的存活时间,即当线程池中的线程数量超过corePoolSize时,多余的空闲线程在终止前等待新任务的最长时间。
  • unit:keepAliveTime的时间单位,可以是秒,毫秒等。
  • workQueue:任务队列,用于存放等待执行的任务。
  • threadFactory:线程工厂,用于创建新的线程并设置一些属性,比如名称,优先级等。
  • handler:拒绝策略,用于处理当任务队列满了且线程池中的线程数量达到最大值时,新提交的任务如何被拒绝执行。
  • 以下是用Java实现这个程序的代码:
  • package Test5;
    
    // 导入java.util.concurrent包,提供并发编程的工具类
    import java.util.concurrent.ExecutorService;
    
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicReference;
    
    public class Test {
        public static void main(String[] args) {
            //赛道长度
            int length = 100;
            //胜利者
            AtomicReference<String> winner = new AtomicReference<>();
            // 创建一个大小为2的线程池
            ExecutorService pool = new ThreadPoolExecutor(2, 2,
                    0L, TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue<Runnable>());
    
            //创建一个乌龟的线程,使用lambda表达式定义run方法
            Thread t1 = new Thread(() -> {
                //当前位置
                double position = 0;
                //循环直到终点或有胜利者
                while (position < length && winner.get() == null) {
                    //移动一定距离
                    position += 1;
                    //打印当前位置
                    System.err.println("乌龟跑了" + position + "米");
                    try {
                        //休眠一定时间
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //判断是否到了终点
                    if (position >= length) {
                        //设置胜利者为自己,如果还没有胜利者
                        winner.compareAndSet(null, "乌龟");
                        System.out.println("胜利者是" + winner.get() + "!");
                        //中断线程池所有线程
                        pool.shutdown();
                    }
                }
            });
            //创建一个兔子的线程,使用lambda表达式定义run方法
            Thread t2 = new Thread(() -> {
                //当前位置
                double position = 0;
                //循环直到终点或有胜利者
                while (position < length && winner.get() == null) {
                    //移动一定距离
                    position += 1.2;
                    //打印当前位置
                    //使用System的printf方法,指定%.0f作为格式符,这样就可以保留0位小数。2
                    System.out.printf("兔子跑了%.0f米\n", position);
                    try {
                        //休眠一段时间
                        Thread.sleep(1000);
                        //兔子跑到600米休眠一定时间
                        if (position >= 60) {
                            System.out.println("兔子正在休息---");
                            Thread.sleep(120000);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //判断是否到了终点
                    if (position >= length) {
                        //设置胜利者为自己,如果还没有胜利者
                        winner.compareAndSet(null, "兔子");
                        System.out.println("胜利者是" + winner.get() + "!");
                        //中断线程池所有线程
                        pool.shutdown();
                        //判断是否要休息,百分之十的概率
                    }
    
                }
            });
            pool.execute(t1);
            pool.execute(t2);
        }
    }
    

    控制台运行结果如下:

  • 乌龟跑了1.0米
    兔子跑了1米
    乌龟跑了2.0米
    兔子跑了2米
    乌龟跑了3.0米
    兔子跑了4米
    乌龟跑了4.0米
    兔子跑了5米
    乌龟跑了5.0米
    兔子跑了6米
    乌龟跑了6.0米
    兔子跑了7米
    乌龟跑了7.0米
    兔子跑了8米
    乌龟跑了8.0米
    兔子跑了10米
    乌龟跑了9.0米
    兔子跑了11米
    兔子跑了12米
    乌龟跑了10.0米
    乌龟跑了11.0米
    兔子跑了13米
    乌龟跑了12.0米
    兔子跑了14米
    兔子跑了16米
    乌龟跑了13.0米
    乌龟跑了14.0米
    兔子跑了17米
    乌龟跑了15.0米
    兔子跑了18米
    乌龟跑了16.0米
    兔子跑了19米
    乌龟跑了17.0米
    兔子跑了20米
    乌龟跑了18.0米
    兔子跑了22米
    乌龟跑了19.0米
    兔子跑了23米
    乌龟跑了20.0米
    兔子跑了24米
    兔子跑了25米
    乌龟跑了21.0米
    乌龟跑了22.0米
    兔子跑了26米
    兔子跑了28米
    乌龟跑了23.0米
    乌龟跑了24.0米
    兔子跑了29米
    乌龟跑了25.0米
    兔子跑了30米
    乌龟跑了26.0米
    兔子跑了31米
    乌龟跑了27.0米
    兔子跑了32米
    兔子跑了34米
    乌龟跑了28.0米
    乌龟跑了29.0米
    兔子跑了35米
    乌龟跑了30.0米
    兔子跑了36米
    兔子跑了37米
    乌龟跑了31.0米
    乌龟跑了32.0米
    兔子跑了38米
    乌龟跑了33.0米
    兔子跑了40米
    乌龟跑了34.0米
    兔子跑了41米
    兔子跑了42米
    乌龟跑了35.0米
    乌龟跑了36.0米
    兔子跑了43米
    乌龟跑了37.0米
    兔子跑了44米
    兔子跑了46米
    乌龟跑了38.0米
    乌龟跑了39.0米
    兔子跑了47米
    乌龟跑了40.0米
    兔子跑了48米
    乌龟跑了41.0米
    兔子跑了49米
    乌龟跑了42.0米
    兔子跑了50米
    乌龟跑了43.0米
    兔子跑了52米
    乌龟跑了44.0米
    兔子跑了53米
    乌龟跑了45.0米
    兔子跑了54米
    乌龟跑了46.0米
    兔子跑了55米
    乌龟跑了47.0米
    兔子跑了56米
    乌龟跑了48.0米
    兔子跑了58米
    兔子跑了59米
    乌龟跑了49.0米
    乌龟跑了50.0米
    兔子跑了60米
    兔子正在休息---
    乌龟跑了51.0米
    乌龟跑了52.0米
    乌龟跑了53.0米
    乌龟跑了54.0米
    乌龟跑了55.0米
    乌龟跑了56.0米
    乌龟跑了57.0米
    乌龟跑了58.0米
    乌龟跑了59.0米
    乌龟跑了60.0米
    乌龟跑了61.0米
    乌龟跑了62.0米
    乌龟跑了63.0米
    乌龟跑了64.0米
    乌龟跑了65.0米
    乌龟跑了66.0米
    乌龟跑了67.0米
    乌龟跑了68.0米
    乌龟跑了69.0米
    乌龟跑了70.0米
    乌龟跑了71.0米
    乌龟跑了72.0米
    乌龟跑了73.0米
    乌龟跑了74.0米
    乌龟跑了75.0米
    乌龟跑了76.0米
    乌龟跑了77.0米
    乌龟跑了78.0米
    乌龟跑了79.0米
    乌龟跑了80.0米
    乌龟跑了81.0米
    乌龟跑了82.0米
    乌龟跑了83.0米
    乌龟跑了84.0米
    乌龟跑了85.0米
    乌龟跑了86.0米
    乌龟跑了87.0米
    乌龟跑了88.0米
    乌龟跑了89.0米
    乌龟跑了90.0米
    乌龟跑了91.0米
    乌龟跑了92.0米
    乌龟跑了93.0米
    乌龟跑了94.0米
    乌龟跑了95.0米
    乌龟跑了96.0米
    乌龟跑了97.0米
    乌龟跑了98.0米
    乌龟跑了99.0米
    乌龟跑了100.0米
    胜利者是乌龟!
    
    Process finished with exit code 0
    

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值