iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java并发编程回环屏障CyclicBarrier
  • 894
分享到

Java并发编程回环屏障CyclicBarrier

2024-04-02 19:04:59 894人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

CyclicBarrier 前面介绍的CountDownLatch在解决多个线程同步方面相对于调用线程的join方法已经有了不少优化。但是CountDownLatch的计数器是一次性

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();

   }
}

image.png

如上代码创建了一个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();

    }
}

image.png

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

到此这篇关于Java并发编程回环屏障CyclicBarrier的文章就介绍到这了,更多相关Java 回环屏障CyclicBarrier内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java并发编程回环屏障CyclicBarrier

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java并发编程回环屏障CyclicBarrier
    CyclicBarrier 前面介绍的CountDownLatch在解决多个线程同步方面相对于调用线程的join方法已经有了不少优化。但是CountDownLatch的计数器是一次性...
    99+
    2024-04-02
  • Java并发编程回环屏障CyclicBarrier实例分析
    本文小编为大家详细介绍“Java并发编程回环屏障CyclicBarrier实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java并发编程回环屏障CyclicBarrier实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-30
  • Java中CyclicBarrier 循环屏障
    目录一、简介二、CyclicBarrier的使用CyclicBarrier 应用场景模拟合并计算场景模拟“人满发车”的场景三、CyclicBarrier 源码...
    99+
    2024-04-02
  • 如何使用Java高并发编程CyclicBarrier
    本篇内容介绍了“如何使用Java高并发编程CyclicBarrier”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是CyclicBarr...
    99+
    2023-06-15
  • Java中CyclicBarrier循环屏障怎么应用
    这篇“Java中CyclicBarrier循环屏障怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中Cycli...
    99+
    2023-06-30
  • Java并发编程之详解CyclicBarrier线程同步
    CyclicBarrier线程同步 java.util.concurrent.CyclicBarrier提供了一种多线程彼此等待的同步机制,可以把它理解成一个障碍,所有先到达这个障碍...
    99+
    2024-04-02
  • 如何在Java中利用CyclicBarrier实现并发编程
    如何在Java中利用CyclicBarrier实现并发编程?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  使用JAVA编写并发程序的时候,我们需要仔...
    99+
    2023-05-31
    java 并发编程 cyclicbarrier
  • java并发编程包JUC线程同步CyclicBarrier语法示例
    目录1.创建CyclicBarrier障碍2.在CyclicBarrier障碍处等待3.CyclicBarrierAction4.CyclicBarrier例子在之前的文章中已经为大...
    99+
    2024-04-02
  • Java CountDownLatch计数器与CyclicBarrier循环屏障怎么定义
    本文小编为大家详细介绍“Java CountDownLatch计数器与CyclicBarrier循环屏障怎么定义”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java CountDownLatch计数器与CyclicB...
    99+
    2023-07-05
  • java多线程之并发工具类CountDownLatch,CyclicBarrier和Semaphore
    目录CountDownLatchSemaphoreCyclicBarrier总结 CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作。 ...
    99+
    2024-04-02
  • Java循环屏障中CyclicBarrier如何实现多线程分段等待执行完成
    Java循环屏障中CyclicBarrier如何实现多线程分段等待执行完成,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言工作中是否有这样的场景,多个线程任务...
    99+
    2023-06-25
  • Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成
    前言 工作中是否有这样的场景,多个线程任务,如果所有线程完成到某个阶段,你希望知道所有线程均完成该阶段。当然你使用线程计数可以实现,只是不够优雅。 所以我即:Java 多线程等待优雅...
    99+
    2024-04-02
  • 面试官问你Java并发编程,如何回答?
    Java并发编程是Java程序员必须掌握的重要技能之一。在面试中,面试官可能会问到一些与Java并发编程相关的问题,例如线程安全、同步机制等。那么,如果面试官问你Java并发编程,你应该如何回答呢?本文将为大家提供一些指导性的建议。 首先,...
    99+
    2023-11-14
    响应 面试 并发
  • Java并发编程之threadLocal
    目录1、ThreadLocal介绍2、ThreadLocal使用实例3、ThreadLocal实现原理1、ThreadLocal介绍 多个线程访问同一个共享变量时特别容易出现并发问题...
    99+
    2024-04-02
  • Java 线程池:并发编程中的并发魔杖
    线程池是一个用于管理线程的机制,它允许应用程序在需要时创建和销毁线程,而不是为每个任务创建单独的线程。这可以显著提高应用程序的性能和可伸缩性。 线程池的好处 使用线程池的主要好处包括: 提高性能:线程池避免了创建和销毁线程的开销,提高了...
    99+
    2024-03-13
    线程池
  • C++并发编程:如何使用原子类和内存屏障?
    C++ 并发编程:使用原子类和内存屏障保障并发安全 在多线程环境中,并发编程是处理共享资源的常见技术。然而,如果不采取适当的措施,并发访问可能会导致数据竞争和内存可见性问题。为了解决这...
    99+
    2024-05-02
    c++ 并发编程 并发访问
  • 什么是Java并发编程
    本篇内容主要讲解“什么是Java并发编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Java并发编程”吧!Java多线程概述在Java中使用多线程是提高程序并发响应能力的重要手段,但同时...
    99+
    2023-06-15
  • Java并发编程之线程中断
    目录线程中断: void interrupted()方法:中断线程,例如,当线程A运行时,线程B可以调用线程A的interrupted()方法来设置线程的中断标志为true并立即返回...
    99+
    2024-04-02
  • Java并发编程信号量Semapher
    Semapher信号量也是Java中的一个同步器,与CountDownLatch和CycleBarrier不同的是,它内部的计数器是递增的,并且在一开始初始化Semaphoer时可以...
    99+
    2024-04-02
  • java并发编程的入门过程
    本篇文章给大家分享的是有关java并发编程的入门过程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、入门介绍1.1、实现线程的2种方式package chapter...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作