Java并发编程之闭锁简介

闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过。它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,初始化为一个正式,正数表示需要等待的事件数量。countDown方法递减计数器,表示一个事件已经发生,而await方法等待计数器到达0,表示等待的事件已经发生。CountDownLatch强调的是一个线程(或多个)需要等待另外的n个线程干完某件事情之后才能继续执行。

    import java.util.concurrent.CountDownLatch;
     
    class Aworker implements Runnable {
    private int num;
    private CountDownLatch begin;
    private CountDownLatch end;
     
    public Aworker(int num, final CountDownLatch begin, final CountDownLatch end) {
    this.num = num;
    this.begin = begin;
    this.end = end;
    }
     
    @Override
    public void run() {
    // TODO Auto-generated method stub
    try {
    System.out.println(num + "th people is ready");
    begin.await();    //准备就绪
    } catch (InterruptedException e) {
    e.printStackTrace();
    } finally {
    end.countDown();    //计数器减一,到达终点
    System.out.println(num + "th people arrive");
    }
    }
    }
     
    public class Race {
    public static void main(String[] args) {
    int num = 10;
    CountDownLatch begin = new CountDownLatch(1);
    CountDownLatch end = new CountDownLatch(num);
     
    for (int i = 1; i <= num; i++) {
    new Thread(new Aworker(i, begin, end)).start();
    }
     
    try {
    Thread.sleep((long) (Math.random() * 5000));
    } catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }  
    System.out.println("judge say : run !");
    begin.countDown(); //开始跑
    long startTime = System.nanoTime();
    try {
    end.await(); //等待结束
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } finally {
    long endTime = System.nanoTime();
    System.out.println("judge say : all arrived !");
    System.out.println("spend time: " + (endTime - startTime));
    }
    }
    }

输出
1th people is ready
2th people is ready
4th people is ready
6th people is ready
3th people is ready
10th people is ready
8th people is ready
5th people is ready
7th people is ready
9th people is ready
judge say : run !
1th people arrive
4th people arrive
10th people arrive
5th people arrive
2th people arrive
judge say : all arrived !
9th people arrive
7th people arrive
8th people arrive
3th people arrive
6th people arrive
spend time: 970933

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。