CountDownLatch和CyclicBarrier解决运动员赛跑多线程问题

最近有道多线程的面试题: 五个运动员(相当于五个线程),一个裁判(Main线程),满足以下三个条件,如何实现: 1.同时起跑 2.要所有运动员都到达终点以后才能进行下一个环节 3.如果有一个运动员摔跤了(异常处理),就终止这次比赛,让所有运动员都到终点进行下个环节

可以使用CountDownLatch和CyclicBarrier来解决这个问题

public class Test {
    private static ExecutorService service = Executors.newCachedThreadPool();
    private static CountDownLatch countDownLatch = new CountDownLatch(5);
    private static CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
    private static Integer count = 0;
    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
        for (int i=0;i<5;i++) {
            service.execute( new Athlete(countDownLatch, cyclicBarrier, i));
        }
        //所有线程执行结束后
        countDownLatch.await();
        System.out.println("下一个环节");
    }
}
class Athlete implements Runnable{
    private final CountDownLatch countDownLatch;
    private final CyclicBarrier cyclicBarrier;
    private final int id;
    Athlete(CountDownLatch countDownLatch,CyclicBarrier cyclicBarrier,int id){
        this.countDownLatch = countDownLatch;
        this.cyclicBarrier = cyclicBarrier;
        this.id = id;
    }
    @Override
    public void run() {
        try {
            //等待其他线程
            cyclicBarrier.await();
            System.out.println(id+"跑步中--------");
            System.out.println(id+"跑完了--------");
        }catch (Exception e){
            System.out.println(id+"受伤啦!");
        }finally {
            //执行完后,进行countDown()
            this.countDownLatch.countDown();
        }
    }
}

结果:当运动员全部正常结束时,进行下一个环节:

当运动员中有人受伤时,我们可以用idea 2018的新功能,throw Exception,来模拟运动员受伤:

搞定!,如果你还在用eclipse,那么强烈给你安利一波idea。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏点滴积累

PhiloGL学习(6)——深情奉献:快乐的一家

 前言 话说上一篇文章结尾讲到这一篇要做一个地球自转以及月球公转的三维动画,提笔,不对,是提键盘开始写的时候脑海中突然出现了几年前春晚风靡的那首歌:蒙古族小丫头...

35940
来自专栏owent

ECUST 09年 校赛个人赛第三场部分解题报告(A,D,F,I)

首先是VC6.0的algorithm里没有min函数,而我用min做变量名导致CE4次,找了半天才找出来

10510
来自专栏小樱的经验随笔

除法取模与逆元/费马小定理

image.png 推导过程如下(摘自Acdreamer博客) 这个为费马小定理,m为素数是费马小定理的前置条件。 ? 求a/b=x(mod M) 只要M...

421100
来自专栏Java帮帮-微信公众号-技术文章全总结

【学习经验】Java中常用英文

【学习经验】Java中常用英文 第一章: public['pʌblik] 公共的,公用的 static['stætik] 静的;静态的...

375100
来自专栏wym

牛客练习赛19-C-托米航空公司

链接:https://www.nowcoder.com/acm/contest/111/C 来源:牛客网

10810
来自专栏HansBug's Lab

1934: [Shoi2007]Vote 善意的投票

1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1174  ...

29770
来自专栏数据结构与算法

BZOJ1061: [Noi2008]志愿者招募(线性规划)

  申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管。布布刚上任就遇到了一个难

17140
来自专栏小樱的经验随笔

BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】

1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 897  Solve...

27950
来自专栏算法修养

HDU 1863 畅通工程(Kruskal)

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

28340
来自专栏deepcc

百度web前端面试题之求两个数的最大公约数和最小公倍数

342100

扫码关注云+社区

领取腾讯云代金券