12.线程间协作:栅栏CyclicBarrier

2023-12-20 20:58

本文主要是介绍12.线程间协作:栅栏CyclicBarrier,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.使用
  • 2.CyclicBarrier的典型应用场景

1.使用

有时候多个线程可能需要相互等待对方执行到代码中的某个地方(集合点),这时这些线程才能够继续执行 。JDK 1.5 开始引入了一个类java.util.concurrent.CyclicBarrier, 该类可以用来实现这种等待。使用CyclicBarrier实现等待的线程被称为参与方 (Party)。参与方只需要执行CyclicBarrier.await() 就可以实现等待。尽管从应用代码的角度来看,参与方是并发执行CyclicBarrier.await() 的。但是, CyclicBarrier 内部维护了一个显式锁,这使得其总是可以在所有参与方中区分出一个最后执行CyclicBarrier.await()的线程,该线程被称为最后一个线程。除最后一个线程外的任何参与方执行 CyclicBarrier.await()都会导致该线程被暂停(线程生命周期状态变为 WAITING)。 最后一个线程执行 CyclicBarrier.await()会使得使用相应 CyclicBarrie 实例的其他所有参与方被唤醒,而最后一个线程自身并不会被暂停。与CountDownLatch不同的是,CyclicBarrier 实例是可重复使用的:所有参与方被唤醒的时候,任何线程再次执行 CyclicBarrier.await()又会被暂停,直到这些线程中的最后一个线程执行了CyclicBarrier.await() 。
CyclicBarrier的其中一个构造器允许我们指定一个被称为barrierAction 的任务 (Runnable 接口实例)。barrierAction会被最后一个线程执行CyclicBarrier. await方法时执行,该任务执行结束后其他等待线程才会被唤醒。

2.CyclicBarrier的典型应用场景

  • 使迭代 (Iterative) 算法并发化。在并发化的迭代算法中,迭代操作是由多个工作者线程并行执行的。CyclicBarrier可用来实现执行迭代操作的任何一个工作者线程必须等待其他工作者线程也完成当前迭代操作的情况下才继续其下一轮的迭代操作,以便形成迭代操作的中间结果作为下一轮迭代的基础(输入)。因此,该应用场景从代码上反映出来的是, CyclicBarrier.await()调用是在一个循环中执行的。
  • 在测试代码中模拟高并发。在编写多线程程序的测试代码时,我们常常需要使用有限的工作者线程来模拟高并发操作。为此,CyclicBarrier可用来实现这些工作者线程中的任意一个线程在执行其操作前必须等待其他线程也准备就绪,即使得这些工作者线程尽可能地在同一时刻开始其操作。

这篇关于12.线程间协作:栅栏CyclicBarrier的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/517472

相关文章

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

什么是 Java 的 CyclicBarrier(代码示例)

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感... 你的回答(口语化,面试场景)面试官:什么是 Java 的 CyclicBarrier?你:好的,我来举个例

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后