首页 > 其他分享 >juc-CyclicBarrier

juc-CyclicBarrier

时间:2024-12-28 18:51:52浏览次数:7  
标签:juc barrier Thread await 线程 CyclicBarrier public

CountDownLatch

可以把它看作一个计数器,这个计数器的操作是原子操作,同时只能有一个线程去减这个计数器里面的值。

向CountDownLatch对象设置一个初始的数字作为计数值,调用 await() 会阻塞,直到这个计数器的计数值被其他的线程减为0。

应用场景

有一个任务想要往下执行,但必须要等到其他的任务执行完毕。调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。


//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public void await() throws InterruptedException { };   

//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  

//将count值减1
public void countDown() { };  

代码

public class Test {


    public static void main(String[] args) {

        final CountDownLatch latch = new CountDownLatch(2);

        // 线程1 启动
        new Thread() {
            public void run() {
                try {
                    System.out.println("子线程" + Thread.currentThread().getName() + "正在执行");
                    Thread.sleep(3000);
                    System.out.println("子线程" + Thread.currentThread().getName() + "执行完毕");
                        
                    latch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            ;
        }.start();

        // 线程2 启动
        new Thread(() -> {
            try {
                System.out.println("子线程" + Thread.currentThread().getName() + "正在执行");
                Thread.sleep(3000);
                System.out.println("子线程" + Thread.currentThread().getName() + "执行完毕");

                latch.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        try {
            latch.await();   // 主线程阻塞
            System.out.println("2个子线程已经执行完毕, 继续执行主线程");

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

 

CyclicBarrier

“循环栅栏”:一个可循环利用的屏障。

它的作用就是会让所有线程都等待完成后才会继续下一步行动。

现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。

利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。

public class Test {

        static class TaskThread extends Thread {

            CyclicBarrier barrier;

            public TaskThread(CyclicBarrier barrier) {
                this.barrier = barrier;
            }

            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println(getName() + " 到达栅栏 A");
                    barrier.await();  // 所有线程到达栅栏A,继续执行

                    Thread.sleep(2000);

                    barrier.await();  // 所有线程到达栅栏B,继续执行

                    System.out.println(getName() + " 冲破栅栏 B");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        public static void main(String[] args) {
            int threadNum = 5;
            CyclicBarrier barrier = new CyclicBarrier(threadNum);

            for (int i = 0; i < threadNum; i++) {
                new TaskThread(barrier).start();
            }
        }

    }

 

 

 

countDownLatch

CyclicBarrier 原理(秒懂)

       

 

标签:juc,barrier,Thread,await,线程,CyclicBarrier,public
From: https://www.cnblogs.com/zrzct/p/18637809

相关文章

  • 【JUC编程】JUC 多线程基础全面解析(速食版,25年后更新专栏)
    这篇文章就多个方面简单涉及一些内容,到2025年我会更新并发编程这个专栏。计划在过年之前更新完,都是从基础到工作中常用(以及可能涉及到)的知识点,有些内容这篇文章没有提及。希望大家可以多多支持、关注一下!文章目录JUC多线程基础全面解析一、线程与并发基础1.什么是......
  • JUC视频学习
    第一节锁相关知识线程的并发问题的由来?比如这里的要执行i++操作;我们一般时在主存存储i的值,然后再cpu进行运算的;所以这里的步骤分为三部:1.cpu从内存获取i的值;2.cpu执行运算+1操作;3.cpu将计算结果进行返回;假设我们这里有两台cpu,一个cpu1一个cpu2;如果cpu1和cpu2同时获取到了......
  • juc相关前置知识
    线程通识概念:线程进程概念进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。是程序执行的最小单位。线程是cpu调度的最小单位,而进程是线程的集合,一个......
  • Java中的 `CountDownLatch` 与 `CyclicBarrier`:区别、使用场景解析
    博主默语带您GotoNewWorld.✍个人主页——默语的博客......
  • JUC并发编程
    LockSupport文章目录LockSupport1.LockSupport是什么2.线程等待唤醒机制3.LockSupport1.LockSupport是什么LockSupport是用于创建锁和其他同步类的基本线程阻塞原语LockSupport没有构造函数,说明不可以new对象,只可以使用静态方法核心方法就是park()和unpark(......
  • JUC 多线程并发编程
    一、基本概念1.进程与线程进程(Process):计算机中正在运行的程序的实例,是操作系统分配资源的基本单位。每个进程拥有自己的内存空间、文件描述符、数据栈等。线程(Thread):进程中的一个执行单元。一个进程中至少有一个线程,通常称为主线程。线程是CPU调度和执行的最小单位。......
  • JUC之基-AQS详解
    AQSAQS是JUC学习的基石,是JUC中许多锁的底层实现机制,我们今天从ReentrantLock出发来深入源码解读AQS的设计。AQS底层AQS的几个重要属性://阻塞队列的头privatetransientvolatileNodehead;//阻塞队列的尾privatetransientvolatileNodetail;//核......
  • JUC 多线程并发编程
    一、基本概念1.进程与线程进程(Process):计算机中正在运行的程序的实例,是操作系统分配资源的基本单位。每个进程拥有自己的内存空间、文件描述符、数据栈等。线程(Thread):进程中的一个执行单元。一个进程中至少有一个线程,通常称为主线程。线程是CPU调度和执行的最小单位。线程共......
  • 强大的三个工具类、CountDownLatch 闭锁 、CyclicBarrier 、Semaphore
    文章目录①、CountDownLatch(闭锁)做减法②、CyclicBarrier做加法③、Semaphore信号量一、CountDownLatch(闭锁)做减法1、CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞2、其它线程调用countDown方法会将计数器减1(调用countDown方法的线......
  • 线程和进程(juc)
    线程一:概念辨析1:线程与进程进程:1:程序由指令和数据组成,指令要执行,数据要读写,就需要将指令加载给cpu,把数据加载到内存,同时程序运行时还会使用磁盘,网络等资源。进程就是负责管理内存,加载指令,管理io的;2:当一个程序运行时就会将程序的相关代码加载到内存中,这就开启了一个进程......