CountDownLatch类放在java.util.concurrent包下,利用它能够实现相似的计数器的功能。相似有一个任务A,它要等待其余4个任务执行完成以后才能执行,此时就能够利用CountDownLatch来实现这种功能了。CountDownLatch是经过一个计数器来实现的,计数器的初始变量线程的数量。每当一个线程完成了本身的任务后,计数器的值就会减1。当计数器值到达0时,它表示全部的线程已经完成了任务,而后在闭锁上等待的线程就能够恢复执行任务。java
countDownLatch是在java1.5被约会,跟它一块儿被约会的工具类还有CyclicBarrier,Semaphore,concurrentHashMap和BlockingQueue。存在于java.util.concurrent包下。app
public class CountDownLatchExample {
ide
// 循环次数
工具
private static final int FOR_NUMBER = 5;
spa
public static void main(String[] args) {
线程
// 查询数据
3d
for (int i = 0; i < FOR_NUMBER; i++) {
code
new Thread(() -> {
orm
System.out.println("查询第:\t" + Thread.currentThread().getName() + "张表数据完成!");
blog
}, String.valueOf(i)).start();
}
System.out.println("查询完毕");
}
}
能够看到,还有数据没查询完成他就体检进行查询完成的操做了。那若是在实际开发过程当中,就等于数据还没处理完成就返回用户数据了。这并非咱们想要的结果。
那么刚才也有说CountDownLatch是多个一个或多个线程等待其余线程完成操做,那么咱们试一下。
public class CountDownLatchExample {
// 循环五次
private static final int FOR_NUMBER = 5;
// 实例化定义一个CountDownLatch须要减小的总次数
private static CountDownLatch countDownLatch = new CountDownLatch(5);
public static void main(String[] args) {
// 查询数据
for (int i = 0; i < FOR_NUMBER; i++) {
new Thread(() -> {
System.out.println("查询第:\t" + Thread.currentThread().getName() + "张表数据完成!");
// 执行完 查询 而后进行递减操做 每次减1
countDownLatch.countDown();
}, String.valueOf(i)).start();
}
try {
countDownLatch.await(); // await()方法起到阻塞的做用,直到计数器值等于0
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("查询完毕");
}
}
突破实现:
有参构造传的是int类型数据
await方法: await()方法合并的做用,直到计数器值等于0才能走下面的逻辑
*若是新计数为零,则全部等待线程都将从新启用*线程调度目的。*若是当前计数等于零,则不会发生任何事情。countDown方法::若是当前计数大于零,则将其递减。
getCount方法:返回当前计数