随笔-3  评论-0  文章-0  trackbacks-0
使用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结果可能也是随机存在的


posted on 2010-07-14 16:04 QZZF 阅读(139) 评论(0)  编辑  收藏