使用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 阅读(145)
评论(0) 编辑 收藏