CyclicBarrier用于一组线程相互等待全部结束之后才进行其他的操作
CyclicBarrier(int parties, Runnable barrierAction)
parties栅栏被倾翻之前必须执行的线程数
barrierAction当栅栏被倾翻时执行的线程
package com.yy.concurrent;
import java.util.concurrent.CyclicBarrier;
/**
* @ClassName: CyclicBarrierTest *
* @Description: 回环栅栏测试
* @author: leijing
* @date: 2016年9月15日 下午4:02:28
*/
public class CyclicBarrierTest {
public static int N = 5;
public static long startTime ;
public static long endTime ;
public static void main(String[] args) {
try {
CyclicBarrier cyclicBarrier = new CyclicBarrier(N,new Runnable() {
public void run() {
endTime = System.currentTimeMillis();
System.out.println("任务全部完成,总共花费"+(endTime-startTime)+"ms");
}
});
startTime = System.currentTimeMillis();
System.out.println("---------开始执行任务---------");
for (int i = 0; i < N; i++) {
new Thread(new WriteWorker(cyclicBarrier)).start();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class WriteWorker implements Runnable{
private CyclicBarrier cyclicBarrier;
public WriteWorker(CyclicBarrier cyclicBarrier){
this.cyclicBarrier = cyclicBarrier;
}
public void run() {
System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据...");
try {
Thread.sleep(5000);
System.out.println("线程"+Thread.currentThread().getName()+"已经写完,等待其他线程写完...");
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("任务全部完成,"+Thread.currentThread().getName()+"可以干其他事情了");
}
}
运行结果: