在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

CountDownLatch应用实战

2017-2-13 12:56| 发布者: zhangjf| 查看: 902| 评论: 0

摘要: 1. CountDownLatch简介 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。其本质就是一个共享锁。 他最主要的作用是用来同步java的线程。 主要有一下三 ...

1. CountDownLatch简介

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。其本质就是一个共享锁。

他最主要的作用是用来同步java的线程。

主要有一下三个方法:

主要方法:

  1. public CountDownLatch(int count);
  2. public void countDown();
  3. public void await();
复制代码

构造方法参数指定了计数的次数

countDown方法,当前线程调用此方法,则计数减一

await方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

?2. 实战应用的例子

一个模拟运动员比赛的例子,首先要等所有的运动员全部给准备好,然后发起“起跑指令”所有的运动员开始起跑,等所有的运动员跑完才结束本次笔试。

代码如下:

运动员线程代码:

  1. package it_cast.day01;
  2. import java.util.concurrent.CountDownLatch;
  3. public class Player implements Runnable {
  4. private int id;
  5. private CountDownLatch begin;
  6. private CountDownLatch end;
  7. public Player(int id, CountDownLatch begin, CountDownLatch end) {
  8. this.id=id;
  9. this.begin=begin;
  10. this.end=end;
  11. }
  12. @Override
  13. public void run() {
  14. // TODO Auto-generated method stub
  15. try {
  16. System.out.println("Play" + id + "ready");
  17. begin.await();// 所有的运动员在这准备者,当一声令下就开始跑
  18. Thread.sleep((long) (Math.random() * 100));// 随机分配时间,即运动员完成时间
  19. System.out.println("Play" + id + " arrived.");
  20. } catch (InterruptedException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. } finally {
  24. end.countDown();// 每个运动员跑完,使end状态减1,最终减至0
  25. }
  26. }
  27. }
复制代码

主代码:

  1. package it_cast.day01;
  2. import java.util.concurrent.CountDownLatch;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. public class CountDownLatchDemo {
  6. private static final int PLAYER_AMOUNT = 5;
  7. public static void main(String[] args) throws InterruptedException {
  8. // TODO Auto-generated method stub
  9. //对于每位运动员,CountDownLatch减1后即结束比赛
  10. CountDownLatch begin = new CountDownLatch(1);
  11. //对于整个比赛,所有运动员结束后才算结束
  12. CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
  13. Player [] plays=new Player[PLAYER_AMOUNT];
  14. //初始化5个运动员
  15. for (int i = 0; i < plays.length; i++) {
  16. plays[i]=new Player(i, begin, end);
  17. }
  18. //设置特定的线程池,大小为5
  19. ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
  20. for(Player p:plays)
  21. exe.execute(p);
  22. Thread.sleep(1000);
  23. System.out.println("Race begins!");
  24. begin.countDown();
  25. end.await();; //等待end状态变为0,即为所有人都跑完了,即为比赛结束
  26. System.out.println("Race ends!");
  27. exe.shutdown();
  28. }
  29. }
复制代码

运行结果如下:

来自: http://my.oschina.net/u/1540325/blog/603298

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 16:16

Copyright 2015-2025 djqfx

返回顶部