直观形象的理解
若干个线程分别执行各自的业务逻辑,需要一个类似checkpoint的节点,让每个线程执行到这个节点时都等一下,等所有的线程都执行到了这个节点之后,再各自往下执行自己的逻辑。
Barrier中途拦截了各个线程的执行流,就好像一个栅栏在路上拦住了各个车子(线程),等所有的车子都到达之后,再统一让各个车子通过栅栏继续跑。
程序
public class CyclicBarrierTest {
public static void main(String[] args) {
int N = 5;
CyclicBarrier cyclicBarrier = new CyclicBarrier(N); //这个是能协调N个线程的CyclicBarrier
for(int i=0; i<N; i++) {
new ServiceThread(cyclicBarrier).start();
}
}
static class ServiceThread extends Thread {
private Logger logger = LoggerFactory.getLogger(ServiceThread.class);
private CyclicBarrier barrier;
public ServiceThread(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
Random r = new Random();
int sleepTime = r.nextInt(5);
sleepTime++;
try {
TimeUnit.SECONDS.sleep(sleepTime); //随机sleep1到5秒,模拟执行了前置业务逻辑
logger.info("线程"+Thread.currentThread().getName()+"执行业务逻辑完毕,等待其他线程也执行完业务逻辑。");
this.barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
logger.info("所有的线程都执行完前置业务逻辑了,线程"+Thread.currentThread().getName()+"继续执行自己接下来的业务逻辑。");
}
}
}
运行结果:
线程Thread-2执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
线程Thread-3执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
线程Thread-0执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
线程Thread-5执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
线程Thread-4执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-4继续执行自己接下来的业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-2继续执行自己接下来的业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-0继续执行自己接下来的业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-3继续执行自己接下来的业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-5继续执行自己接下来的业务逻辑。