1. CountDownLatch简介 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。其本质就是一个共享锁。 他最主要的作用是用来同步java的线程。 主要有一下三个方法: 主要方法: - public CountDownLatch(int count);
- public void countDown();
- public void await();
复制代码 构造方法参数指定了计数的次数 countDown方法,当前线程调用此方法,则计数减一 await方法,调用此方法会一直阻塞当前线程,直到计时器的值为0 ?2. 实战应用的例子 一个模拟运动员比赛的例子,首先要等所有的运动员全部给准备好,然后发起“起跑指令”所有的运动员开始起跑,等所有的运动员跑完才结束本次笔试。 代码如下: 运动员线程代码: - package it_cast.day01;
- import java.util.concurrent.CountDownLatch;
- public class Player implements Runnable {
- private int id;
- private CountDownLatch begin;
- private CountDownLatch end;
-
- public Player(int id, CountDownLatch begin, CountDownLatch end) {
- this.id=id;
- this.begin=begin;
- this.end=end;
- }
-
- @Override
- public void run() {
- // TODO Auto-generated method stub
- try {
- System.out.println("Play" + id + "ready");
- begin.await();// 所有的运动员在这准备者,当一声令下就开始跑
- Thread.sleep((long) (Math.random() * 100));// 随机分配时间,即运动员完成时间
- System.out.println("Play" + id + " arrived.");
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- end.countDown();// 每个运动员跑完,使end状态减1,最终减至0
- }
- }
- }
复制代码 主代码: - package it_cast.day01;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class CountDownLatchDemo {
- private static final int PLAYER_AMOUNT = 5;
- public static void main(String[] args) throws InterruptedException {
- // TODO Auto-generated method stub
- //对于每位运动员,CountDownLatch减1后即结束比赛
- CountDownLatch begin = new CountDownLatch(1);
-
- //对于整个比赛,所有运动员结束后才算结束
- CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
- Player [] plays=new Player[PLAYER_AMOUNT];
-
- //初始化5个运动员
- for (int i = 0; i < plays.length; i++) {
- plays[i]=new Player(i, begin, end);
- }
-
- //设置特定的线程池,大小为5
- ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
- for(Player p:plays)
- exe.execute(p);
- Thread.sleep(1000);
- System.out.println("Race begins!");
- begin.countDown();
- end.await();; //等待end状态变为0,即为所有人都跑完了,即为比赛结束
- System.out.println("Race ends!");
- exe.shutdown();
- }
- }
复制代码 运行结果如下:  来自: http://my.oschina.net/u/1540325/blog/603298 |