使用CountDownLatch来模拟马拉松比赛

本文介绍了一种使用并发与多线程技术模拟马拉松比赛的程序实现,通过CountDownLatch等Java并发工具实现了选手的准备、起跑与成绩记录过程。

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

import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *
 * 使用CountDownLatch来模拟马拉松比赛
 *
 * @author 杨尚川
 */
public class MarathonSimulator {
    public static void main(String[] args) throws Exception{
        ExecutorService executorService = Executors.newCachedThreadPool();
        int personCount = 3;
        final CountDownLatch prepare = new CountDownLatch(personCount);
        final CountDownLatch start = new CountDownLatch(1);
        final CountDownLatch end = new CountDownLatch(personCount);
        final Queue<String> queue = new ConcurrentLinkedQueue<>();
        if(personCount < 3){
            System.out.println("参赛人数必须 > 2");
            return;
        }
        for(int i=1; i<=personCount; i++){
            final int personNumber = i;
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    //模拟准备时间,使用随机数
                    try{
                        Thread.sleep(new Random(personNumber).nextInt(1000));
                    }catch(Exception e){}
                    System.out.println(personNumber+"号运动员准备完毕");
                    prepare.countDown();
                    try {
                        //等待开始跑的命令
                        start.await();
                    }catch (Exception e){}
                    System.out.println(personNumber+"号运动员开始跑");
                    long s = System.currentTimeMillis();
                    //模拟跑步时间,使用随机数
                    try{
                        Thread.sleep(new Random(personNumber).nextInt(10000));
                    }catch(Exception e){}
                    long c = System.currentTimeMillis() - s;
                    System.out.println(personNumber+"号运动员到达目的地,耗时:"+c+"毫秒");

                    end.countDown();
                    queue.add(personNumber+"号");
                }
            });
        }
        System.out.println("有"+personCount+"名运动员参加本次的马拉松比赛");
        System.out.println("教练在等待运动员准备...\n");
        prepare.await();
        System.out.println("\n所有运动员准备完毕,教练开始喊:预备 --- 跑!");
        start.countDown();
        System.out.println("\n教练在等待所有的运动员跑完...\n");
        end.await();

        System.out.println("\n所有运动员都跑完了,开始颁奖啦:");
        System.out.println("冠军是:"+queue.poll());
        System.out.println("亚军是:"+queue.poll());
        System.out.println("季军是:"+queue.poll());

        executorService.shutdown();
    }
}

 

 

10人参加比赛程序运行之后的输出结果:

有10名运动员参加本次的马拉松比赛
教练在等待运动员准备...

2号运动员准备完毕
10号运动员准备完毕
7号运动员准备完毕
8号运动员准备完毕
5号运动员准备完毕
6号运动员准备完毕
3号运动员准备完毕
4号运动员准备完毕
1号运动员准备完毕
9号运动员准备完毕

所有运动员准备完毕,教练开始喊:预备 --- 跑!

教练在等待所有的运动员跑完...

2号运动员开始跑
7号运动员开始跑
3号运动员开始跑
4号运动员开始跑
9号运动员开始跑
10号运动员开始跑
1号运动员开始跑
6号运动员开始跑
5号运动员开始跑
8号运动员开始跑
4号运动员到达目的地,耗时:1866毫秒
8号运动员到达目的地,耗时:2367毫秒
3号运动员到达目的地,耗时:3736毫秒
7号运动员到达目的地,耗时:4241毫秒
2号运动员到达目的地,耗时:6113毫秒
6号运动员到达目的地,耗时:6616毫秒
10号运动员到达目的地,耗时:7117毫秒
1号运动员到达目的地,耗时:8989毫秒
5号运动员到达目的地,耗时:9491毫秒
9号运动员到达目的地,耗时:9993毫秒

所有运动员都跑完了,开始颁奖啦:
冠军是:4号
亚军是:8号
季军是:3号
3人参加比赛程序运行之后的输出结果:

有3名运动员参加本次的马拉松比赛
教练在等待运动员准备...

2号运动员准备完毕
3号运动员准备完毕
1号运动员准备完毕

所有运动员准备完毕,教练开始喊:预备 --- 跑!

教练在等待所有的运动员跑完...

2号运动员开始跑
1号运动员开始跑
3号运动员开始跑
3号运动员到达目的地,耗时:3737毫秒
2号运动员到达目的地,耗时:6112毫秒
1号运动员到达目的地,耗时:8990毫秒

所有运动员都跑完了,开始颁奖啦:
冠军是:3号
亚军是:2号
季军是:1号
 

 

 

 

 

 

 

 

 

 

CountDownLatchJava 中的一个并发工具类,用于实现线程间的协调和控制。它的主要作用是让某个线程等待其他线程执行完毕之后再继续执行。 下面是一个使用 CountDownLatch 进行并发模拟的例子: ```java import java.util.concurrent.CountDownLatch; public class ConcurrencySimulation { public static void main(String[] args) throws InterruptedException { int threadCount = 5; // 线程数量 // 创建一个 CountDownLatch,初始计数为线程数量 CountDownLatch latch = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; i++) { Thread thread = new Thread(new Worker(latch)); thread.start(); } // 主线程等待所有子线程执行完毕 latch.await(); System.out.println("所有线程执行完毕"); } static class Worker implements Runnable { private final CountDownLatch latch; public Worker(CountDownLatch latch) { this.latch = latch; } @Override public void run() { try { // 模拟线程执行耗时操作 Thread.sleep(1000); System.out.println("线程执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 每个线程执行完毕后将计数器减一 latch.countDown(); } } } } ``` 这个例子创建了 5 个子线程,每个子线程执行耗时操作后将计数器减一。主线程调用 `latch.await()` 方法,等待所有子线程执行完毕后输出 "所有线程执行完毕"。通过使用 CountDownLatch,可以实现简单的并发模拟和线程间的协调控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值