屏障CyclicBarrier


CyclicBarrier 循环屏障,循环栅栏
那么如何理解呢?
循环栅栏指的是当一个线程到达栅栏时,停止运行,并等待其它线程的到来,当线程数达到一定数量时,这几个线程再继续运行。
示意图:
示例讲解
更通俗一点的理解呢
相当于有一个饭店,你们够5个人才能吃饭,不够5个人,那就等够了5个人。
这里的人指的就是线程,饭店相当于CyclicBarrier。
这里写一个Demo
有一个 Person 类的线程
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Person implements Runnable {
private CyclicBarrier cyclicBarrier;
private int num;
public Person(CyclicBarrier cyclicBarrier,int num){
this.cyclicBarrier = cyclicBarrier;
this.num = num;
}
@Override
public void run() {
try {
//做一些事
System.out.println(num + "做一些事");
Thread.sleep(1000*2);
//事情做完,相当于到了栅栏处,等待其它线程做完。
cyclicBarrier.await();
Thread.sleep(1000*2);
System.out.println(num + "做完了");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
我们构造一个 CyclicBarrier,指定当有3个线程时,CyclicBarrier就可以做一些事情,然后到达的3个线程就可以继续运行。
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PersonOperator {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {
@Override
public void run() {
System.out.println("over once");
}
});
ExecutorService executorService = Executors.newCachedThreadPool();
for(int i=0; i<6; i++){
executorService.execute(new Person(cyclicBarrier,i));
}
executorService.shutdown();
}
}
输出结果
0做一些事
1做一些事
2做一些事
3做一些事
4做一些事
5做一些事
over once
over once
2做完了
4做完了
3做完了
1做完了
0做完了
5做完了
扫码分享
版权说明
作者:SQBER
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
{0}
{5}
{1}
{2}回复
{4}
*昵称:
*邮箱:
个人站点:
*想说的话: