您的位置:首页 > 其它

CountDownLatch笔记

2016-12-13 15:59 113 查看
CountDownLatch是java的concurrent包下的一个倒计时锁。

//倒计时锁
public class CountDownLatch {

//锁
private final Sync sync;

//构造函数
//count:表示必须调用count次countDown()方法,await()方法才不会阻塞
//或者我们可以说倒计时数是count
//当然了,倒计时数必须是非负数
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}

//该方法使得当前线程一直阻塞,直到倒计时数是0,或者当前线程被其他线程中断而抛出InterruptedException异常
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}

//该方法有3种结果
//1.倒计时数是0,或者在达到超时timeout之前,倒计时数变为0,则返回true
//2.在达到超时timeout后,倒计时数还未变为0,则返回false
//3.当前线程被中断而该方法会抛出InterruptedException异常
public boolean await(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}

//1.倒计时数大于0,则倒计时数会递减1
//2.倒计时数等于0,则倒计时数不递减
public void countDown() {
sync.releaseShared(1);
}

}


//=====================================================

通过代码来理解CountDownLatch的使用,当然了,在这里我只是单线程形式,一般情况下CountDownLatch都是使用在多线程模式下的。

java.util.concurrent.CountDownLatch latch = new java.util.concurrent.CountDownLatch(2);
try {
System.out.println("1");
boolean rs = latch.await(1L, TimeUnit.SECONDS);//1秒之后,await方法返回false,程序往下运行
System.out.println("2,rs:" + rs);
latch.countDown();
System.out.println("4");
latch.countDown();
latch.await();//必须调用了2次countDown()方法,计时数才变为0,await()方法不会阻塞
System.out.println("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: