CountDownLatch是1.5版本引入的一个同步工具类,名称直译大概就是倒计时锁存器
CountDownLatch只有一个构造方法,需要传入一个大于等于0的int数字作为计数的总数
其中很重要的两个方法:
countDown() 和await()
public void countDown() {
sync.releaseShared(1);
}
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
其中countDown()是使总计数-1
await是检查当前总计数的数量,如果大于0,则会等待其他线程执行任务来保证同步
await还有一个重载的方法,接收一个long和时间单位,
public boolean await(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}
它的作用是当等待了xx时间之后会继续执行下面的代码,不去管count是否为0
public static void main(String[] args) {
int count = 200;
CountDownLatch latch = new CountDownLatch(count);
for (int i = 0; i < count -1; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + ": do something");
latch.countDown();//计数减一
}).start();
}
try {
Thread.sleep(100);//小睡一会
System.out.println(latch.getCount());
latch.await();//检查计数是否大于0 大于0不执行后面的语句
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行完毕");
}
执行结果,程序会一直等待,造成死锁
latch.await(2, TimeUnit.SECONDS);
两秒之后无论计数是否到达0 一定会继续执行下面的代码
另一种,其中TimeUtil是一个枚举
还有一个没那么重要的方法 获取当前计数
但是这我觉得有点小问题,构造方法传入总数用的是int,计数只会减少不会增加,这里返回确是用的long?
public long getCount() {
return sync.getCount();
}