返回顶部
首页 > 资讯 > 精选 >Java并发编程回环屏障CyclicBarrier实例分析
  • 487
分享到

Java并发编程回环屏障CyclicBarrier实例分析

2023-06-30 04:06:04 487人浏览 安东尼
摘要

本文小编为大家详细介绍“Java并发编程回环屏障CyclicBarrier实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“java并发编程回环屏障CyclicBarrier实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入

本文小编为大家详细介绍“Java并发编程回环屏障CyclicBarrier实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“java并发编程回环屏障CyclicBarrier实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

CyclicBarrier

前面介绍的CountDownLatch在解决多个线程同步方面相对于调用线程的join方法已经有了不少优化。但是CountDownLatch的计数器是一次性的,也就是等到计数器值变为0后,再调用CountDownLatch的await和countdown方法都会立刻返回,这就起不到线程同步的效果了。所以为了满足计数器可以重置的需要,jdk开发组提供了CyclicBarrier类,并且CyclicBarrier类的功能并不限于CountDownLatch的功能。从字面意思理解 CyclicBarrier 是回环屏障的意思,它可以让一组线程全部达到一个状态后再全部同时执行。这里之所以叫作回环是因为当所有等待线程执行完毕,并重置CyclicBarrier 的状态后它可以被重用。之所以叫作屏障是因为线程调用await方法后就会被阻塞,这个阻塞点就称为屏障点,等所有线程都调用了 await方法后,线程们就会冲破屏障,继续向下运行。在介绍原理前先介绍几个实例以便加深理解。在下面的例子中,我们要实现的是,使用两个线程去执行一个被分解的任务 A,当两个线程把自己的任务都执行完毕后再对它们的结果进行汇总处理。

import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CycleBarrierTest {      //创建一个线程数固定为2的线程池   private static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Runnable() {       @Override       public void run() {           System.out.println(Thread.currentThread() + " task1 merge result");       }   });   public static void main(String[] args) throws InterruptedException{       ExecutorService executorService = Executors.newFixedThreadPool(2);              //添加线程A到线程池       executorService.submit(new Runnable() {           @Override           public void run() {               try {                   System.out.println(Thread.currentThread() + "task1");                   System.out.println(Thread.currentThread() + "enter in  barrier");                   cyclicBarrier.await();                   System.out.println(Thread.currentThread() + "enter out  barrier");               } catch (Exception e) {                   e.printStackTrace();               }           }       });       //添加线程B到线程池       executorService.submit(new Runnable() {           @Override           public void run() {               try {                   System.out.println(Thread.currentThread() + "task2");                   System.out.println(Thread.currentThread() + "enter in  barrier");                   cyclicBarrier.await();                   System.out.println(Thread.currentThread() + "enter out  barrier");               } catch (Exception e) {                   e.printStackTrace();               }           }       });       //关闭线程池       executorService.shutdown();   }}

Java并发编程回环屏障CyclicBarrier实例分析

如上代码创建了一个CyclicBarrier对象,其第一个参数为计数器初始值,第二个数Runable是当计数值为0时需要执行的任务。在main函数里面首先创建了一个大小为2的线程池。然后添加两个子任务到线程池,每个子任务在执行完自己的逻辑后会调用方法。一开始计数器值为2,当第一个线程调用await方法时,计数器值会递减为1,由于此时计数器值不为0,所以当前线程就到了屏障点而被阻塞。然后第二个线程调用await时,会进入屏障,计数器值也会递减,现在计数器值为0,这时就会去执行 CyclicBarrier构造函数中的任务,执行完毕后退出屏障点,并且唤醒被阻塞的第二个线程。这时候第一个线程也会退出屏障点继续向下运行。

上面的例子说明了多个线程之间是相互等待的,假如计数器值为N,那么随后调用 await 方法的N1个线程都会因为到达屏障点而被阻塞,当第N个线程调用await后,计数器值为0了,这时候第N个线程才会发出通知唤醒前面的N1个线程。也就是当全部线程都到达屏障点时才能一块继续向下执行。对于这个例子来说,使用CountDownLatch也可以得到类似的输出结果。下面再举个例子来说明CyclicBarrier的可复用性。

假设一个任务由阶段1、阶段2和阶段3组成,每个线程要串行地执行阶段1、阶段2和阶段3,当多个线程执行该任务时,必须要保证所有线程的阶段1全部完成后才能进入阶段2执行,当所有线程的阶段2全部完成后才能进入阶段3执行。下面使用 CyclicBarrier 来完成这个需求。

import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CycleBarrierTest1 {    //创建一个线程数固定为2的线程池    private static CyclicBarrier cyclicBarrier = new CyclicBarrier(2);    public static void main(String[] args) throws InterruptedException{        ExecutorService executorService = Executors.newFixedThreadPool(2);        //添加线程A到线程池        executorService.submit(new Runnable() {            @Override            public void run() {                try {                    System.out.println(Thread.currentThread() + "step1");                    cyclicBarrier.await();                    System.out.println(Thread.currentThread() + "step2");                    cyclicBarrier.await();                    System.out.println(Thread.currentThread() + "step3");                    cyclicBarrier.await();                } catch (Exception e) {                    e.printStackTrace();                }            }        });        //添加线程B到线程池        executorService.submit(new Runnable() {            @Override            public void run() {                try {                    System.out.println(Thread.currentThread() + "step1");                    cyclicBarrier.await();                    System.out.println(Thread.currentThread() + "step2");                    cyclicBarrier.await();                    System.out.println(Thread.currentThread() + "step3");                    cyclicBarrier.await();                } catch (Exception e) {                    e.printStackTrace();                }            }        });        //关闭线程池        executorService.shutdown();    }}

Java并发编程回环屏障CyclicBarrier实例分析

如上代码中,每个子线程在执行完阶段1后都调用了await方法,等到所有线程都到达屏障点后才会一块往下执行,这就保证了所有线程都完成了阶段1后才会开始执行阶段2。

读到这里,这篇“Java并发编程回环屏障CyclicBarrier实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Java并发编程回环屏障CyclicBarrier实例分析

本文链接: https://lsjlt.com/news/327282.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java并发编程回环屏障CyclicBarrier实例分析
    本文小编为大家详细介绍“Java并发编程回环屏障CyclicBarrier实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java并发编程回环屏障CyclicBarrier实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-30
  • Java并发编程回环屏障CyclicBarrier
    CyclicBarrier 前面介绍的CountDownLatch在解决多个线程同步方面相对于调用线程的join方法已经有了不少优化。但是CountDownLatch的计数器是一次性...
    99+
    2024-04-02
  • Java之JMM高并发编程实例分析
    这篇文章主要介绍“Java之JMM高并发编程实例分析”,在日常操作中,相信很多人在Java之JMM高并发编程实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java之JMM高并发编程实例分析”的疑惑有所...
    99+
    2023-07-02
  • Java并发编程之线程状态实例分析
    今天小编给大家分享一下Java并发编程之线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。线程状态概述线程由生到...
    99+
    2023-06-30
  • java并发编程包JUC线程同步CyclicBarrier语法示例
    目录1.创建CyclicBarrier障碍2.在CyclicBarrier障碍处等待3.CyclicBarrierAction4.CyclicBarrier例子在之前的文章中已经为大...
    99+
    2024-04-02
  • 如何在Java中利用CyclicBarrier实现并发编程
    如何在Java中利用CyclicBarrier实现并发编程?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  使用JAVA编写并发程序的时候,我们需要仔...
    99+
    2023-05-31
    java 并发编程 cyclicbarrier
  • Java并发编程之线程池的示例分析
    这篇文章将为大家详细讲解有关Java并发编程之线程池的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是线程池是一种基于池化思想管理线程的工具。池化技术:池化技术简单点来说,就是提前保存大量的资...
    99+
    2023-06-20
  • Java循环屏障中CyclicBarrier如何实现多线程分段等待执行完成
    Java循环屏障中CyclicBarrier如何实现多线程分段等待执行完成,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言工作中是否有这样的场景,多个线程任务...
    99+
    2023-06-25
  • Go并发编程的示例分析
    这篇文章给大家分享的是有关Go并发编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、goroutine定义给函数前加上go即可不需要在定义是区分是否是异步函数调度器在合适的点进行切换,这个点是有很多...
    99+
    2023-06-20
  • Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成
    前言 工作中是否有这样的场景,多个线程任务,如果所有线程完成到某个阶段,你希望知道所有线程均完成该阶段。当然你使用线程计数可以实现,只是不够优雅。 所以我即:Java 多线程等待优雅...
    99+
    2024-04-02
  • Java并发编程之ConcurrentLinkedQueue源码的示例分析
    这篇文章给大家分享的是有关Java并发编程之ConcurrentLinkedQueue源码的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、ConcurrentLinkedQueue介绍并编程中,一般需...
    99+
    2023-06-15
  • Java面试题之并发编程的示例分析
    小编给大家分享一下Java面试题之并发编程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!面试题1:说一下你对ReentrantLock的理解?ReentrantLock是JDK1.5引入的,它拥有与synchro...
    99+
    2023-06-20
  • Java并发线程池实例分析讲解
    目录一.为什么要用线程池二.线程池的好处三.原理解析四.4种线程池五.线程池处理流程六.源码分析一.为什么要用线程池 先来看个简单的例子 1.直接new Thread的情况: ...
    99+
    2023-02-02
    Java并发线程池 Java线程池
  • C语言并发编程模型实例分析
    这篇文章主要介绍“C语言并发编程模型实例分析”,在日常操作中,相信很多人在C语言并发编程模型实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言并发编程模型实例分析”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • SingleFlight模式的Go并发编程实例分析
    这篇文章主要介绍了SingleFlight模式的Go并发编程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SingleFlight模式的Go并发编程实例分析文章都会有所收获,下面我们一起来看看吧。在go...
    99+
    2023-06-30
  • Java多线程并发、并行、线程与进程实例分析
    本篇内容介绍了“Java多线程并发、并行、线程与进程实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、并发与并行并发:指两个或多个事...
    99+
    2023-07-02
  • Java并发编程之Fork/Join框架的示例分析
    这篇文章主要介绍了Java并发编程之Fork/Join框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Fork/Join框架的理解ForkJoinTask类属...
    99+
    2023-06-15
  • Java并发编程之关键字volatile的示例分析
    这篇文章给大家分享的是有关Java并发编程之关键字volatile的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、作用被 volatile 修饰的变量保证了不同线程对该变量操作的内存可见性禁止指令重排...
    99+
    2023-06-15
  • Java并发面试题实例分析
    这篇文章主要讲解了“Java并发面试题实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发面试题实例分析”吧!题目结论多线程并发的同时进行set、get操作, A线程...
    99+
    2023-06-05
  • Java并发编程之同步容器与并发容器的示例分析
    这篇文章主要为大家展示了“Java并发编程之同步容器与并发容器的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java并发编程之同步容器与并发容器的示例分析”这篇文章吧。一、同步容器&n...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作