CountDownLatch

在java.util.concurrent包下,它有类似计数器的功能,比如现有一个线程A,要等待其他3个线程执行完才执行,这时候可以用CountDownLatch来实现。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

构造器:

CountDownLatch(int count) count为线程数

方法:

await() 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行

await(long timeout, TimeUnit unit) 和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行

countDown() 将count值减1

getCount() 获取当前的count

例子:

 1 public class Test {
 2      public static void main(String[] args) {   
 3          final CountDownLatch latch = new CountDownLatch(2);
 4  
 5          new Thread(){
 6              public void run() {
 7                  try {
 8                      System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
 9                     Thread.sleep(3000);
10                     System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
11                     latch.countDown();
12                 } catch (InterruptedException e) {
13                     e.printStackTrace();
14                 }
15              };
16          }.start();
17  
18          new Thread(){
19              public void run() {
20                  try {
21                      System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
22                      Thread.sleep(3000);
23                      System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
24                      latch.countDown();
25                 } catch (InterruptedException e) {
26                     e.printStackTrace();
27                 }
28              };
29          }.start();
30  
31          try {
32              System.out.println("等待2个子线程执行完毕...");
33             latch.await();
34             System.out.println("2个子线程已经执行完毕");
35             System.out.println("继续执行主线程");
36         } catch (InterruptedException e) {
37             e.printStackTrace();
38         }
39      }
40 }

结果:

线程Thread- 0 正在执行 线程Thread- 1 正在执行 等待 2 个子线程执行完毕... 线程Thread- 0 执行完毕 线程Thread- 1 执行完毕 2 个子线程已经执行完毕 继续执行主线程
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄