Java并发编程(CyclicBarrier)实例详解

yizhihongxing

Java并发编程(CyclicBarrier)实例详解

概述

Java并发编程的一个重要组成部分就是同步化,也就是为了解决多线程情况下线程之间的通信和数据共享的问题。在实际开发中,有些业务场景需要多个线程一起协作完成某个任务,这个时候就需要用到CyclicBarrier。

CyclicBarrier是一个同步工具类,当线程执行到CyclicBarrier的时候,会等待其他线程到达,直到所有线程都到达后才会继续执行。CyclicBarrier提供了一个非常有用的构造函数,在构造函数中可以定义一个屏障操作,屏障操作会在所有线程到达前执行。

CyclicBarrier的使用

使用CyclicBarrier需要以下几个步骤:

  1. 创建一个CyclicBarrier对象

java
CyclicBarrier cyclicBarrier = new CyclicBarrier(int parties, Runnable barrierAction);

参数parties表示需要等待到达屏障的线程的个数,barrierAction是屏障操作,当所有线程到达屏障前执行。

  1. 每个线程执行到CyclicBarrier的时候,调用await()方法等待。

java
cyclicBarrier.await();

当线程到达屏障后,如果所有线程都已经到达,就会执行barrierAction。然后所有线程继续执行。

下面将用两个示例说明CyclicBarrier的使用。

示例1:多个线程协作完成一个任务

需求:实现多个人一起协作开会的场景,人到齐了才能开始开会。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class Meeting {
    public static void main(String[] args) {
        int personCount = 6;
        Runnable barrierAction = () -> System.out.println("所有人到齐了,开始开会。");
        CyclicBarrier cyclicBarrier = new CyclicBarrier(personCount, barrierAction);

        for (int i = 0; i < personCount; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " 来了。");
                    cyclicBarrier.await();
                    System.out.println(Thread.currentThread().getName() + " 开始开会。");
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }, "person " + i).start();
        }
    }
}

示例输出:

person 0 来了。
person 2 来了。
person 1 来了。
person 4 来了。
person 3 来了。
person 5 来了。
所有人到齐了,开始开会。
person 0 开始开会。
person 1 开始开会。
person 3 开始开会。
person 2 开始开会。
person 4 开始开会。
person 5 开始开会。

示例2:多个线程同时请求一个接口

需求:多个线程同时请求一个接口,当所有线程都请求完毕后,再进行下一步操作。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class HttpRequest {
    public static void main(String[] args) {
        int threadCount = 5;
        Runnable barrierAction = () -> System.out.println("所有请求都已经完成,开始下一步操作。");
        CyclicBarrier cyclicBarrier = new CyclicBarrier(threadCount, barrierAction);

        for (int i = 0; i < threadCount; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " 发送请求。");
                try {
                    Thread.sleep((long) (Math.random() * 5000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " 请求完成。");

                try {
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }, "thread " + i).start();
        }
    }
}

示例输出:

thread 0 发送请求。
thread 3 发送请求。
thread 2 发送请求。
thread 1 发送请求。
thread 4 发送请求。
thread 1 请求完成。
thread 3 请求完成。
thread 0 请求完成。
thread 4 请求完成。
thread 2 请求完成。
所有请求都已经完成,开始下一步操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java并发编程(CyclicBarrier)实例详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Java多线程之并发编程的基石CAS机制详解

    Java多线程之并发编程的基石CAS机制详解 什么是CAS CAS,即Compare And Swap,中文翻译为比较并交换。是一种无锁算法,用于实现多线程同步。在CAS操作中包含三个操作数:内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CA…

    多线程 2023年5月16日
    00
  • 分析python并发网络通信模型

    下面我结合示例详细讲解“分析python并发网络通信模型”的完整攻略。 一、了解Python的GIL Python语言自身带有GIL(全局解释器锁)。GIL是一种互斥锁,它保证同时只有一个线程在解释器中被执行,这样也就导致了Python的多线程程序并不能利用多核CPU的优势。 因此,在Python中实现并发多线程需要使用多个进程而不是多个线程,或者使用一些协…

    多线程 2023年5月17日
    00
  • 并发编程ConcurrentLinkedQueue示例详解

    下面是“并发编程ConcurrentLinkedQueue示例详解”的完整攻略: 并发编程ConcurrentLinkedQueue示例详解 什么是ConcurrentLinkedQueue ConcurrentLinkedQueue是Java的一个并发工具类,它提供了线程安全的队列操作。与LinkedList不同,ConcurrentLinkedQueue…

    多线程 2023年5月16日
    00
  • C# 多线程学习之基础入门

    关于”C#多线程学习之基础入门”的攻略,我可以从以下几个部分进行讲解: 一、多线程的基础概念 多线程指的是在一个应用程序中同时运行多个线程,它们可以同时进行不同的任务。在C#中,要实现多线程的操作,需要用到System.Threading命名空间下的相关类。在多线程的编程中,常用的概念包括线程的状态、互斥锁、信号量等。 二、创建和启动线程 在C#中,可以通过…

    多线程 2023年5月17日
    00
  • Java并发之不可思议的死循环详解

    你好,关于“Java并发之不可思议的死循环详解”的攻略,我将从以下几个方面展开说明: 1. 产生死循环的原因 Java中死循环是指一个线程在执行某段代码时,由于某种原因,一直无法从该循环中退出,导致程序无法顺利结束。产生死循环的原因主要有以下几种: 对共享的数据进行操作时,没有使用同步机制,导致多个线程之间的并发访问出现问题。 在对象的等待/通知过程中,没有…

    多线程 2023年5月16日
    00
  • MySQL系列之十 MySQL事务隔离实现并发控制

    MySQL事务隔离实现并发控制是MySQL数据库中非常重要的一个功能,它能够实现对并发事务的隔离,避免出现并发访问数据库时的数据一致性问题。本文将为读者介绍MySQL事务隔离的基本概念、实现方式及其使用方法。 MySQL事务隔离的基本概念 MySQL事务隔离是指通过数据库隔离等级(Isolation Level)来实现多个并发事务间互不影响的机制。在MySQ…

    多线程 2023年5月16日
    00
  • Golang超全面讲解并发

    Golang超全面讲解并发 简介 本文将介绍Golang并发相关的知识,包括如何使用goroutine和channel等内容。并发编程是Golang的一大特色,也是Golang广泛应用的原因之一。本文可以帮助有一定Golang基础的开发者更好的理解并发编程的概念和实现。 Goroutine Goroutine是Golang并发编程的关键,每个Goroutin…

    多线程 2023年5月16日
    00
  • python如何支持并发方法详解

    下面是关于Python如何支持并发方法的详解攻略。 1. 什么是并发? 并发是指一个系统可以同时处理多个任务的能力。Python中通过多线程和多进程两种方式实现并发编程。 2. Python的并发方法 2.1 多线程 Python中的多线程通过threading库实现。多线程可以在同一进程内分配不同任务给不同线程执行,从而提高程序的效率。 下面是一个基本的多…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部