CountDownLatch的用法
1.CounDownLatch作用:
多线程工具类Countdownlatch的用法:
特点:当我们需要 一个或多个线程 要等待其他线程执行完毕之后再执行时,就可以使用Countdownlatch工具类来完成
2.CountDownLatch的使用:
-
1.初始化CountDownLatch对象时,会传递一个整型参数count(计数器),这就是要在某些线程等待执行之前要执行的线程个数
-
例如:现在Thread1,Thread2,Thread3三个线程要在Thread4线程执行之前完成,那么此时参数就是3
-
2.coundown方法,调用一次该方法,参数count就会-1
-
3.await()方法,调用该方法的线程,如果count不为0,说明还有线程没执行完,此时调用await方法的线程就会进入等待状态,直到count为0才唤醒
3.案例演示
1.0版银行取钱案例
假设现在有6个人到银行取钱,银行柜员需要这6个人都取完钱她才能下班
public class CountdownlatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
for(int i=0;i<6;i++){
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"客人取钱完毕!");
countDownLatch.countDown();//count-1,完成了一个线程
},Integer.toString(i)).start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName()+"银行柜员下班");
}
}
2.0版银行取钱案例
如果这6个人中一个人有事情走了,我们知道银行柜员不可能一直等待,所以我们这时候可以给await方法设置一个等待时长
public boolean await(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}
public class CountdownlatchDemo2 {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
for(int i=0;i<6;i++){
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"客人取钱完毕!");
countDownLatch.countDown();//count-1,完成了一个线程
},Integer.toString(i)).start();
}
//规定等待时长3s
countDownLatch.await(3, TimeUnit.MICROSECONDS);
System.out.println(Thread.currentThread().getName()+"银行柜员下班");
}
}