CyclicBarrier
表示大家彼此等待,等大家集合好后才开始出发,分散活动后又在指定地点集合碰面
package com.javase.thread;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* @author Alex Zhuang
*
*/
public class CyclicBarrierDemo {
private static boolean isPrint1=true;
private static boolean isPrint2=true;
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
final CyclicBarrier barrier = new CyclicBarrier(3);
ExecutorService threadPool = Executors.newCachedThreadPool();
for(int i=0;i<3;i++){
Runnable command =new Runnable(){
public void run() {
System.out.println(Thread.currentThread().getName()+" is waiting now");
try {
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(5000));
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("the number of threads currently waiting at the barrier 1 is : "+barrier.getNumberWaiting());
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
lock.lock();
try{
if(isPrint1){
System.out.println("All the 3 threads have arrived at place 1");
isPrint1=false;
}
}finally{
lock.unlock();
}
System.out.println(Thread.currentThread().getName()+" is waiting now");
try {
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(5000));
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("the number of threads currently waiting at the barrier 2 is : "+barrier.getNumberWaiting());
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
lock.lock();
try{
if(isPrint2){
System.out.println("All the 3 threads have arrived at place 2");
isPrint2=false;
}
}finally{
lock.unlock();
}
}
};
threadPool.execute(command);
}
threadPool.shutdown();
}
}