package com.mtools.cyclebarrier.test;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
public class TestCyclicBarrier {
private static final int THREAD_NUM = 5;
public static class WorkerThread implements Runnable{
CyclicBarrier barrier;
String name;
int count;
public WorkerThread(CyclicBarrier b, String n, int i){
this.barrier = b;
this.name = n;
this.count = i;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
if(this.count<=2){
System.out.println(this.name+" sleep...");
Thread.sleep(3000);
}
System.out.println(this.name + " Worker's waiting");
//线程在这里等待,直到所有线程都到达barrier。
barrier.await(1, TimeUnit.SECONDS);
System.out.println(this.name + " ID:"+Thread.currentThread().getId()+" Working");
}catch(Exception e){
// e.printStackTrace();
}
}
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
//当所有线程到达barrier时执行
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("\nInside Barrier\n");
}
});
for(int i=0;i<THREAD_NUM;i++){
new Thread(new WorkerThread(cb, "before"+i, i)).start();
}
// Thread.sleep(1000);
// for(int i=0;i<THREAD_NUM;i++){
// new Thread(new WorkerThread(cb, "after"+i, i)).start();
// }
}
}