我不喜欢讲理论, 直接上代码看效果, 简单''粗暴''!
代码1:
public static void main(String[] args) throws Exception {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
for (int i = 0; i < 3; i++) {
System.out.println("第"+i+"次循环开始");
cyclicBarrier.await();
System.out.println("第"+i+"次循环结束");
}
}
首先创建CyclicBarrier对象, 构造传入一个int类型, 这里传入3 , 表示需要有3个线程调用 cyclicBarrier对象的await()方法后,
所有的线程到cyclicBarrier.await()代码后的代码才会继续执行
所以这段代码结果如下:
代码2:
public static void main(String[] args) throws Exception {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
new Thread() {
public void run() {
try {
System.out.println(Thread.currentThread().getName()+":执行你想要的操作");
Thread.sleep(5000);
cyclicBarrier.await();//让当前线程到await状态
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":执行后续操作");
}
}.start();
new Thread() {
public void run() {
try {
System.out.println(Thread.currentThread().getName()+":执行你想要的操作");
Thread.sleep(7000);
cyclicBarrier.await();//让当前线程到await状态
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":执行后续操作");
}
}.start();
for (int i = 0; i < 3; i++) {
System.out.println("第" + i + "次循环开始");
cyclicBarrier.await();//让当前线程到await状态
System.out.println("第" + i + "次循环结束");
}
}
创建了2个线程, 并且让每个线程都到await状态, (为了看到效果,可以让线程睡眠一下),结果:
可以看到, 当有3个线程调用了 cyclicBarrier.await(), 后第1次循环就执行完,
但是第2次循环, 又停住了, 因为CyclicBarrier 对象是循环使用的, 即: 回环
所以又要有3个线程执行: cyclicBarrier.await(); 则第2次循环才回执行完
我们抽取创建线程的代码,
代码3:
public static void main(String[] args) throws Exception {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
for (int i = 0; i < 3; i++) {
System.out.println("第" + i + "次循环开始");
if (i == 0 || i == 1) {
// 创建2个线程, 执行cyclicBarrier.await();
createTwoThreadExcuteAwait(cyclicBarrier);
}
cyclicBarrier.await();// 让当前线程到await状态
System.out.println("第" + i + "次循环结束");
}
}
private static void createTwoThreadExcuteAwait(CyclicBarrier cyclicBarrier) {
new Thread() {
public void run() {
try {
System.out.println(Thread.currentThread().getName() + ":执行你想要的操作");
Thread.sleep(5000);
cyclicBarrier.await();// 让当前线程到await状态
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":执行后续操作");
}
}.start();
new Thread() {
public void run() {
try {
System.out.println(Thread.currentThread().getName() + ":执行你想要的操作");
Thread.sleep(7000);
cyclicBarrier.await();// 让当前线程到await状态
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":执行后续操作");
}
}.start();
}
结果如下, 你应该也可猜到: 第3次循环只开始,没有结束(这里打印的是i的值, i从0开始,所以为"第2次循环")
到现在, 应该明白这个CyclicBarrier,这个回环栅栏的简单使用吧
应用场景:(个人想法)
比如用户上传大文件, 后台将一个大文件分成很多小文件, 多线程往很多数据库存数据, 当所有数据库都写完了,
才能往主数据库记录文件信息和上传状态等
,然后才能返回给用户,上传成功!
等等!