并发之CyclicBarrier

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执行完毕!

参考资料

发布了213 篇原创文章 · 获赞 31 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_38336658/article/details/102384164