CountDownLatch
CountDownLatch
在java.util.concurrent包下,它有类似计数器的功能,比如现有一个线程A,要等待其他3个线程执行完才执行,这时候可以用CountDownLatch来实现。
构造器:
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
个子线程已经执行完毕
继续执行主线程