CountDownLatch和CyclicBarrier解决运动员赛跑多线程问题
2018-04-11 21:20
363 查看
最近有道多线程的面试题:
五个运动员(相当于五个线程),一个裁判(Main线程),满足以下三个条件,如何实现:
1.同时起跑
2.要所有运动员都到达终点以后才能进行下一个环节
3.如果有一个运动员摔跤了(异常处理),就终止这次比赛,让所有运动员都到终点进行下个环节
可以使用CountDownLatch和CyclicBarrier来解决这个问题
结果:当运动员全部正常结束时,进行下一个环节:
当运动员中有人受伤时,我们可以用idea 2018的新功能,throw Exception,来模拟运动员受伤:
搞定!,如果你还在用eclipse,那么强烈给你安利一波idea。
五个运动员(相当于五个线程),一个裁判(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。
相关文章推荐
- CountDownLatch,Semaphore,CyclicBarrier多线程工具类的使用
- java多线程-concurrent-CountDownLatch和CyclicBarrier
- 【java】多线程控制(一)---Semaphore、Exchanger、CyclicBarrier、CountDownLatch
- 多线程系列之Semaphore、CyclicBarrier、CountDownLatch
- java多线程并发(一)Semaphore,volatile,synchronized ,Lock, CyclicBarrier和CountDownLatch
- Android进阶——多线程系列之Semaphore、CyclicBarrier、CountDownLatch
- C++线程 -- boost::barrier解决多线程分工问题
- 两个重要的多线程辅助类之CyclicBarrier和CountDownLatch的用法
- java多线程问题之同步器CyclicBarrier
- 多线程CyclicBarrier与CountDownLatch使用示例
- java多线程开发之CyclicBarrier,CountDownLatch
- java多线程问题之同步器CyclicBarrier
- Java/Android多线程并发、同步,线程之间通信,主、子线程的一些问题(CountDownLatch、CyclicBarrier和Semaphore)
- 16_张孝祥_多线程_同步工具CyclicBarrier与CountDownLatch
- Java多线程——其他工具类CyclicBarrier、CountDownLatch和Exchange
- java多线程 栅栏(CyclicBarrier) 和 多线程辅助类 CountDownLatch
- C#使用读写锁解决多线程并发写入文件时线程同步的问题
- 多线程安全问题的解决方法一
- CountDownLatch和CyclicBarrier 专题