CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行的执行工作,然后在进行下一步步骤之前等待,直至所有任务都完成,它使得所有的并行任务都将在删栏出列队,因此可以一致的向前移动。

当调用await时  指定的任务运行完后会awiat  直到最后一个线程运行完毕,才继续执行下一步动作

用法和countDownLatch差不多  countDownLatch只触发一次,而CyclicBarrier可以多次重用


public class CyclicBarrierSimple {

public static void main(String[] args) {
int N = 4;
/**
* partie:在达到删栏时 指定的线程数被阻塞等待...
* barrierAction:到达删栏时 执行的线程任务
*/
CyclicBarrier barrier = new CyclicBarrier(N,new ThreadRunner());
for (int i = 0; i < N; i++) {
new Writer(barrier).start();
}
try {
Thread.sleep(25000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("CyclicBarrier重用");

for(int i=0;i<N;i++) {
new Writer(barrier).start();
}
}

static class ThreadRunner implements Runnable{

@Override
public void run() {
System.out.println("大家统一到达删栏后执行...");
}
}

static class Writer extends Thread {

private CyclicBarrier cyclicBarrier;

public Writer(CyclicBarrier barrier) {
cyclicBarrier = barrier;
}

@Override
public void run() {
System.out.println(System.currentTimeMillis() + "线程" + Thread.currentThread().getName() + " 正在写入数据...");
try {
//以睡眠来模拟写入数据库操作
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("线程" + Thread.currentThread().getName() + "写入数据完毕,等待其他线程写入完毕");
int index = cyclicBarrier.await();
System.out.println("越过栅栏后的索引" + index);
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "所有线程写入完毕,继续处理其他任务");

}
}
}
 

1553691604894线程Thread-1 正在写入数据...
1553691604894线程Thread-3 正在写入数据...
1553691604894线程Thread-2 正在写入数据...
1553691604894线程Thread-0 正在写入数据...
线程Thread-1写入数据完毕,等待其他线程写入完毕
线程Thread-0写入数据完毕,等待其他线程写入完毕
线程Thread-2写入数据完毕,等待其他线程写入完毕
线程Thread-3写入数据完毕,等待其他线程写入完毕
大家统一到达删栏后执行...
越过栅栏后的索引0
越过栅栏后的索引1
越过栅栏后的索引3
Thread-1所有线程写入完毕,继续处理其他任务
越过栅栏后的索引2
Thread-0所有线程写入完毕,继续处理其他任务
Thread-2所有线程写入完毕,继续处理其他任务
Thread-3所有线程写入完毕,继续处理其他任务
CyclicBarrier重用
1553691629896线程Thread-4 正在写入数据...
1553691629896线程Thread-5 正在写入数据...
1553691629896线程Thread-6 正在写入数据...
1553691629896线程Thread-7 正在写入数据...
线程Thread-5写入数据完毕,等待其他线程写入完毕
线程Thread-6写入数据完毕,等待其他线程写入完毕
线程Thread-4写入数据完毕,等待其他线程写入完毕
线程Thread-7写入数据完毕,等待其他线程写入完毕
大家统一到达删栏后执行...
越过栅栏后的索引0
越过栅栏后的索引3
Thread-5所有线程写入完毕,继续处理其他任务
越过栅栏后的索引1
Thread-4所有线程写入完毕,继续处理其他任务
越过栅栏后的索引2
Thread-6所有线程写入完毕,继续处理其他任务
Thread-7所有线程写入完毕,继续处理其他任务

最新文章

  1. Winform API &quot;user32.dll&quot;中的函数
  2. WinForm 多窗体操作
  3. MAC OS上Nginx安装
  4. Java 16进制、unicode互转
  5. php : 单例设计演示
  6. 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。
  7. codevs 1835 魔法猪学院 A*寻k短路做了一个月卡死在spfa那了/(ㄒoㄒ)/~~
  8. [转]java工程师成神之路
  9. MSCRM Plugin Debug
  10. 如何快速delete数据
  11. oracle的全文索引
  12. Codeforces Gym 100650D Queens, Knights and Pawns 暴力
  13. jqery筛选
  14. [转]Delphi Form的释放和隐藏:free,hide,close
  15. java csv 文件 操作类
  16. Android-1-电话拨号程序
  17. 【IE6的疯狂之十一】CSS的优先级及!important在IE6下的BUG
  18. 我的C#跨平台之旅(一):从 Hello World 开始
  19. Java基础——iO(二)
  20. iOS使用NSURLConnection发送同步和异步HTTP Request

热门文章

  1. PyQt(Python+Qt)学习随笔:QListWidget对项进行排序的sortItems方法
  2. XSS挑战赛(2)
  3. 动态svg图片简单制作
  4. Jenkins Job间传递参数的一种方法
  5. Springboot mini - Solon详解(二)- Solon的核心
  6. 牛客挑战赛46 C
  7. Mybatis(二)--SqlMapConfig.xml配置文件
  8. ATS (apache traffic server) http_ui 设置与使用
  9. 30道 有趣的 的 JVM 面试题
  10. RabbitMQ 详解 五种队列-SpiritMark