假若有若干个线程都要进行写数据操作,并且只有所有线程都完成写数据操作之后,这些线程才能继续做后面的事情,此时就可以利用CyclicBarrier了
package com.juc;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
System.out.println("主线程开始执行!");
CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
@Override
public void run() {
System.out.println("等待所有线程执行结束后,打印88888");
}
});
for (int i = 0; i < 4; i++) {
new CyclicBarrierThread(cyclicBarrier).start();
}
System.out.println("子线程执行完毕,主线程继续执行!");
}
static class CyclicBarrierThread extends Thread{
private CyclicBarrier cyclicBarrier;
public CyclicBarrierThread(CyclicBarrier cyclicBarrier){
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println("子线程:"+Thread.currentThread().getName()+"正在执行!");
try {
Thread.sleep(3000);
System.out.println("子线程:"+Thread.currentThread().getName()+"执行完毕!");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}finally {
System.out.println("所有线程执行完毕!");
}
}
}
}
**注:**1、所有线程执行完成后需要进行其他逻辑操作时,可以通过CyclicBarrier 的Runnable参数,Runnable中的run方法可以线程执行完成后的操作。
2、在初次的4个线程越过barrier状态后,又可以用来进行新一轮的使用。而CountDownLatch无法进行重复使用