学习多线程之CyclicBarrier使用

简介: 学习多线程之CyclicBarrier使用

写在前面


今天我们来学习多线程中CyclicBarrier工具,其含义是一个可循环使用的屏障工具,有点像上篇文章中所讲到的CountDownLatch工具类,下面就一起来看看到底是哪里有些不同吧。


学习多线程之CyclicBarrier使用


CyclicBarrier工具,特征主要是有这么两点。

其一是可循环使用,不像是CountDownLatch的对象,只能使用一次,这个工具没有数量等条件的限制,有的只是支持的线程数参数而已,所以也就可以循环使用了。

其二是提供了屏障的效果,可以使得多个线程同时在屏障处实现等待的效果,只有所有的线程都处于屏障处的效果,才可以同时继续往下运行。

当然了,要理解这个工具的使用,还需要一个代码示例才能解决,来看一下如下的代码吧:


public static void main(String[] args) {
    Thread thread = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("所有的线程都已准备好,开始运行主线程"+System.currentTimeMillis());
        }
    });
    CyclicBarrier cyclicBarrier = new CyclicBarrier(4, thread);
    Thread thread0 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("thread0运行ing"+System.currentTimeMillis());
            cyclicBarrier.await();
        }
    });
    Thread thread1 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("thread1运行ing"+System.currentTimeMillis());
            cyclicBarrier.await();
        }
    });
    Thread thread2 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("thread2运行ing"+System.currentTimeMillis());
            cyclicBarrier.await();
        }
    });
    Thread thread3 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("thread3运行ing"+System.currentTimeMillis());
            Thread.sleep(3000);
            cyclicBarrier.await();
        }
    });
    thread0.start();
    thread1.start();
    thread2.start();
    thread3.start();
}


这段代码的执行结果如下所示:

thread1运行ing1645933806635

thread2运行ing1645933806635

thread0运行ing1645933806635

thread3运行ing1645933806635

所有的线程都已准备好,开始运行主线程1645933809636

如果你看过上一篇文章的话,就会知道今天的代码大同小异。

还是来解释一下,CyclicBarrier的使用,要传入两个参数,一个参数是线程数,另一个参数是等待所有线程到达屏障处要执行的线程任务。

从上面的代码中,我们得到了预期的结果,那就是thread线程等待了所有线程都准备好了才开始执行自己线程。

这一点大家也可以去自行试一下。


相关文章
|
4月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
58 0
|
2月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
147 6
【Java学习】多线程&JUC万字超详解
|
5月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
34 1
|
4月前
|
设计模式 安全 Java
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
Java面试题:如何实现一个线程安全的单例模式,并确保其在高并发环境下的内存管理效率?如何使用CyclicBarrier来实现一个多阶段的数据处理任务,确保所有阶段的数据一致性?
66 0
|
4月前
|
Java 开发者
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
27 0
|
5月前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
128 0
|
5月前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
26 0
|
5月前
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
191 0
|
5月前
|
Java
Java线程学习经典例子-读写者演示
Java线程学习经典例子-读写者演示
24 0
|
6月前
|
Java 调度
【JAVA学习之路 | 提高篇】线程的通信
【JAVA学习之路 | 提高篇】线程的通信