使用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結果可能也是隨機存在的
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結果可能也是隨機存在的