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

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日

相关文章

  • Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?

    首先,Redis的单线程模型指的是在一个进程中只有一个IO线程对外提供服务,并且在处理命令时会使用单个CPU核心进行工作,这样会减少锁竞争、避免线程切换等导致的性能损耗,同时也提高了Redis的稳定性。 然而,Redis在处理某些操作时,如大规模的集合运算、多个客户端的并发操作等,单线程模型下的性能并不如预期。所以,Redis在3.0版本以后引入了多线程技术…

    多线程 2023年5月17日
    00
  • Java多线程ForkJoinPool实例详解

    Java多线程ForkJoinPool实例详解 什么是ForkJoinPool? ForkJoinPool是Java7中新增的并发框架,是一个专为执行大规模任务而设计的线程池,它可以把一个大任务拆分成多个小任务并行处理,最终将所有小任务的结果合并起来,得到最终的执行结果。 ForkJoinPool的基本用法 ForkJoinPool的使用类似于Java中的E…

    多线程 2023年5月16日
    00
  • Python实现多并发访问网站功能示例

    我来详细讲解一下“Python实现多并发访问网站功能示例”的完整攻略。 实现这个功能主要分为以下几个步骤: 步骤一:安装依赖模块 实现多并发访问网站的功能,需要使用到Python中的requests和threading模块,在使用之前需要先进行安装。 pip install requests 步骤二:定义请求函数 在实现多并发访问网站的过程中,需要定义一个请…

    多线程 2023年5月17日
    00
  • Java同步锁synchronized用法的最全总结

    Java同步锁synchronized用法的最全总结 1. 什么是同步锁? 在Java多线程编程中,同步锁是一种用于控制多线程并发访问的手段。它可以确保同一时间只有一个线程可以执行一段代码,从而保证线程安全。 synchronized关键字就是Java中最常用的同步锁。通过在方法或代码块上添加synchronized关键字,可以将这些方法或代码块变为同步代码…

    多线程 2023年5月17日
    00
  • 深入理解JAVA多线程之线程间的通信方式

    深入理解JAVA多线程之线程间的通信方式 在JAVA多线程编程中,线程间通信是非常重要的一个话题。本文将深入探讨JAVA多线程中线程间通信的几种方式,并通过实例说明其应用。 线程间通信的方式 在JAVA多线程编程中,线程间通信有如下几种方式: 1. 共享内存 共享内存是指多个线程共享同一块内存区域,这样多个线程可以通过读取和修改共享内存中的数据来实现线程间的…

    多线程 2023年5月17日
    00
  • Java线程并发工具类CountDownLatch原理及用法

    Java线程并发工具类CountDownLatch原理及用法 简介 CountDownLatch是一种非常实用的java线程同步工具类,主要作用是允许一个或多个线程一直等待,在其他线程执行完一组操作之后才执行。 CountDownLatch主要有两个方法:* countDown() : 对计数器进行操作,将计数器的值减少1* await() : 调用该方法的…

    多线程 2023年5月16日
    00
  • Java多线程锁机制相关原理实例解析

    Java多线程锁机制相关原理实例解析 概述 Java的多线程编程是一种很常见的编程方式,为保证多线程运行时数据安全性,需要使用锁机制。本篇文章将详细介绍Java多线程锁机制相关原理实例解析。 锁机制相关原理 什么是锁? 锁(Lock)是多线程编程中用来保护共享资源的机制。当多线程同时访问共享资源时,可能会出现数据竞争(Data Race)问题。数据竞争指多个…

    多线程 2023年5月16日
    00
  • Java多线程回调方法实例解析

    Java多线程回调方法实例解析 什么是回调方法 在Java中,回调方法是指将一个方法作为参数传递给另一个方法,并在另一个方法执行后,调用传入的方法。这种方式可以让我们将一个方法的执行结果传递给另一个方法,从而实现代码的复用和解耦。 为什么要使用多线程回调方法 在多线程编程中,需要处理并发执行的任务。一个任务执行完成后,需要通知其他任务执行相关的代码,这时就需…

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