Java并发编程之闭锁简介

54 阅读2分钟

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

场景应用

10个运动员准备赛跑,他们等待裁判一声令下就开始同时跑,当最后一个人通过终点的时候,比赛结束。10个运动相当于10个线程,这里关键是控制10个线程同时跑起来,还有怎么判断最后一个线程到达终点。可以用2个闭锁,第一个闭锁用来控制10个线程等待裁判的命令,第二个闭锁控制比赛结束。

\

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));

}

}

}

\

输出

1thpeopleisready

2thpeopleisready

4thpeopleisready

6thpeopleisready

3thpeopleisready

10thpeopleisready

8thpeopleisready

5thpeopleisready

7thpeopleisready

9thpeopleisready

judgesay:run!

1thpeoplearrive

4thpeoplearrive

10thpeoplearrive

5thpeoplearrive

2thpeoplearrive

judgesay:allarrived!

9thpeoplearrive

7thpeoplearrive

8thpeoplearrive

3thpeoplearrive

6thpeoplearrive

spendtime:970933