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();
}
..