java并发流程控制(CountDownLatch-CycliBarrier)

1)CountDownLatch 门插销计数器
      1.  启动线程,然后等待线程结束。即常用的主线程等所有子线程结束后再执行的问题。

public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
final int count=10;
final CountDownLatch completeLatch = new CountDownLatch(count);//定义了门插销的数目是10
for(int i=0;i
Thread thread = new Thread("worker thread"+i){
public void run(){
//do xxxx
completeLatch.countDown();//减少一根门插销
}
};
thread.start();
}
completeLatch.await();//如果门插销还没减完则等待。
}

2.启动很多线程,等待通知才能开始

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
final CountDownLatch startLatch = new CountDownLatch(1);//定义了一根门插销

for (int i = 0; i < 10; i++) {
Thread thread = new Thread("worker thread" + i) {
public void run() {
try {
startLatch.await();//如果门插销还没减完则等待
} catch (InterruptedException e) {

}
// do xxxx
}
};
thread.start();
}
startLatch.countDown();//减少一根门插销
}


2) CycliBarrier. 等所有线程都达到一个起跑线后才能开始继续运行。
public class CycliBarrierTest implements Runnable {
private CyclicBarrier barrier;

public CycliBarrierTest(CyclicBarrier barrier) {
this.barrier = barrier;
}

public void run() {
//do xxxx;
try {
this.barrier.await();//线程运行至此会检查是否其它线程都到齐了,没到齐就继续等待。到齐了就执行barrier的run函数体里的内容
} catch (Exception e) {

}
}

/**
* @param args
*/
public static void main(String[] args) {
//参数2代表两个线程都达到起跑线才开始一起继续往下执行
CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {
public void run() {
//do xxxx;
}
});
Thread t1 = new Thread(new CycliBarrierTest(barrier));
Thread t2 = new Thread(new CycliBarrierTest(barrier));
t1.start();
t2.start();
}

}
        

你可能感兴趣的:(java)