Java多线程(6)——CountDownLatch

CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch 的一个有用特性是,它不要求调用countDown() 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个await()。

构造方法:    

  • CountDownLatch(int count)   构造一个用给定计数初始化的 CountDownLatch。 

成员方法:

  •  void await() 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。 
  • boolean await(long timeout, TimeUnit unit)   使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
  •  void countDown()   递减锁存器的计数,如果计数到达零,则释放所有等待的线程。 

 long getCount()   返回当前计数。
  

public class CountDownLatchTest {
	  private static CountDownLatch doneSignal = new CountDownLatch(5);
	  public static void main(String[] args) {	  
	     try { 
	         for(int i=0; i<5; i++)
	             new InnerThread().start();	 
	         System.out.println("main await begin.");
	         // "主线程"等待线程池中5个任务的完成
//	         doneSignal.await(2, TimeUnit.SECONDS);	 
	         doneSignal.await();
	         System.out.println("main await finished.");
	    } catch (InterruptedException e) {
	         e.printStackTrace();
	    }
	 }	 
     static class InnerThread extends Thread{
         public void run() {
             try {
            	 TimeUnit.SECONDS.sleep(1);
            	 System.out.println(Thread.currentThread().getName() + " sleep 1000ms.");            
                 doneSignal.countDown();// 将CountDownLatch的数值减1
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     }
}

运行结果:

上面的代码中,CountDownLatch初始化计数为5,main线程中创建了5个子线程,每个线程递减锁存器,直至将锁存器计数清零。而主线程调用了await()方法,它会在这里一直阻塞,知道锁存计数器清零。这是锁存计数器刚好清零的情况,如果:

  1. 锁存计数器没有清零,那么主线程将一直阻塞,或者直到await(long timeout, TimeUnit unit)设置的阻塞时间。
  2. countDown()方法调用的次数,大于锁存计数器初始值,那么主线程将会在再锁存计数器清零的时候开始和子线程争夺资源,而锁存计数器在清零后,将不会继续递减。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值