基本概念
CyclicBarrier(循环屏障)是一个同步工具,可以实现一组线程等待至某个状态后再全部同时执行。在所有等待线程都被释放之后, Cyclicbarrier可以被重用。Cyclicbarrier的运行状态叫做Barrier状态,在调用await方法后,线程就处于Barrier状态.
重要的方法await()方法介绍
- public int await() :挂起当前线程知道所有的线程都为 Barrier状态再同时执行后续的代码.
- public int await(long timeout , TimeUnit unit):设置一个超时时间,在超时时间过后,如果还有线程未达到Barrier状态,则不再等待,让达到Barrier状态的线程继续执行后续的任务.
具体使用方法如下:
public static void main(String[] args) {
int N=4;
//定义cyclicBarrier
CyclicBarrier cyclicBarrier = new CyclicBarrier(N);
for (int i = 0; i < N; i++) {
new MyThread(cyclicBarrier).start();
}
}
//定义业务线程
static class MyThread extends Thread{
private CyclicBarrier cyclicBarrier;
public MyThread(CyclicBarrier cyclicBarrier)
{
this.cyclicBarrier=cyclicBarrier;
}
@Override
public void run() {
try {
Thread.sleep(5000);
System.out.println("线程准备工作完成,等待其他线程");
//等待其他线程也成为了Barrier状态
cyclicBarrier.await();
//另外一个await 可以设置等待时间
// cyclicBarrier.await(1000, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("所有线程执行完毕,执行剩下的内容");
}
}
以上代码先定义了一个 Cyclicbarrier,然后循环启动了多个线程,每个线程都通过构造函数将 Cyclic Barrier传线程中,在线程内部开始执行第1阶段的工作,比如查询数据等;第1阶段的工作处理完成后,再调用 cyclicbarrier. await方法等待其他线程也完成第1阶段的工作( Cyclic Barrier让一组线程等待到达某个状态再一起执行);等其他线程也执行完第1阶段的工作后,便可执行并发操作的下一项任务,比如数据分发等。