CyclicBarrier介绍
中文直译:回环阻碍。就是大家执行完相关的业务之后一起等到所有线程执行完,一起结束。
CyclicBarrier与CounntDownLatch区别
区别
CyclicBarrier:所有线程一开始大家随便跑,执行业务各自逻辑,然后执行完一起等到所有线程执行完毕,一起结束。
CountDownLatch:所有线程创建之后,一起等,大家人齐了之后一起跑,但是我保证不了大家一起等到某个时间点执行结束。
各自应用场景
CyclicBarrier:举个栗子:批量下载图片,然后将他们压缩成zip。大家一开始随便跑,全部线程执行下载图片完了再执行压缩操作。
CountDownLatch:可以用于测试并发的问题,1000个线程一起跑,模拟1000个请求,1000QPS这样。
构造方法
public CyclicBarrier(int parties) {
this(parties, null);
}
parties表示多少个线程大家一起等
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <= 0) throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
barrierAction线程表示大家线程等待完成之后执行的逻辑,比如插入数据库表示执行完成,或者打印一句话等等。
重要方法
public int await() throws InterruptedException, BrokenBarrierException {
try {
return dowait(false, 0L);
} catch (TimeoutException toe) {
throw new Error(toe); // cannot happen
}
}
线程会等待其他线程一起结束。
栗子
import lombok.AllArgsConstructor;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ThreadLocalRandom;
/**
* Created on 2019/10/8.
*
* @author yangsen
*/
@AllArgsConstructor
public class CThread implements Runnable{
CyclicBarrier cyclicBarrier;
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"业务逻辑执行完成...");
try {
Thread.sleep(ThreadLocalRandom.current().nextInt(2000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"等待其他线程执行完成...");
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"执行完毕!");
}
}
public static void main(String[] args) {
CyclicBarrier cyclicBarrier=new CyclicBarrier(6, new Runnable() {
@Override
public void run() {
System.out.println("执行线程完成之后相关操作.............");
}
});
for(int i=0;i<6;i++){
new Thread(new CThread(cyclicBarrier)).start();
}
}
执行结果
Thread-0业务逻辑执行完成…
Thread-1业务逻辑执行完成…
Thread-2业务逻辑执行完成…
Thread-3业务逻辑执行完成…
Thread-4业务逻辑执行完成…
Thread-5业务逻辑执行完成…
Thread-2等待其他线程执行完成…
Thread-0等待其他线程执行完成…
Thread-5等待其他线程执行完成…
Thread-1等待其他线程执行完成…
Thread-3等待其他线程执行完成…
Thread-4等待其他线程执行完成…
执行线程完成之后相关操作…
Thread-4执行完毕!
Thread-3执行完毕!
Thread-1执行完毕!
Thread-5执行完毕!
Thread-0执行完毕!
Thread-2执行完毕!