java闭锁_实例讲解Java并发编程之闭锁

闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过。它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,初始化为一个正式,正数表示需要等待的事件数量。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));

}

}

}

输出

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值