类 CountDownLatch

类 CountDownLatch
使用CountDownLatch可以保证指定线程数的顺利完成,如下:

public
  class  CountDownLatchTest {
    
static   int  N = 5 ; // 指定需要等待完成的线程数
    
    
static  CountDownLatch cdl = new  CountDownLatch(N);
    
    
static  List list = new  ArrayList();
    
    
public   static   void  main(String[] args) {
         for ( int  i = 0 ;i < N;i ++ ){
            
new  Thread( new  countDownLatchRunnable(i), " Thread_ " + i).start();
        }
        
try  {
            cdl.await();
// 等待在cdl.countDown()之前进行的操作都顺利完成
        }  catch  (InterruptedException e) {
            
//  TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(
" LIST_1 size[ " + list.size() + " ] " ); // 希望获得是size>=5
    }
    
    
static   class  countDownLatchRunnable  implements  Runnable{
        
int  num;
        
        countDownLatchRunnable(
int  num){
            
this .num = num;
        }
        
        @Override
        
public   void  run() {
            doWork();
// 而在cdl.countDown()之前的操作,则在调用await()时,则会等待该部分操作完成
            cdl.countDown();
            list.add(num);
// 如果在cdl.countDown()后添加操作,那么在cdl.await()处并不会等待该部分操作完成,而是会有竞争
        }
        
private   void  doWork(){
            
// 执行其他工作
            list.add(num);
        }
    }
}

如果不使用
CountDownLatch,那么在main线程和其他线程都是处于竞争关系,最后的size结果可能也是随机存在的


你可能感兴趣的:(类 CountDownLatch)