`

Java并发编程之CyclicBarrier的使用

    博客分类:
  • Java
阅读更多

Java并发编程之CyclicBarrier的使用

 

先看javadoc对这个类的说明:A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. CyclicBarriers are useful in programs involving a fixed sized party of threads that must occasionally wait for each other. The barrier is called cyclic because it can be re-used after the waiting threads are released.

什么时候用这个类?当有多个线程完成类似的任务,如果需要每个线程在执行任务中的某个地方停下来,等待其它线程也到达相同的等待点(其实不同的等待点也行),那这个类就完美解决了这个需求,比如(后面有代码):有多个跑步的人,各自跑的速度不一样,但是大家需要在中途某个点聚一聚,然后在一起出发。

 

以下是CyclicBarrier的public方法:

 

 

关于两个参数的构造方法:



 也就是说如果用了这个方法,那么当等待在await()方法上的线程数 = getParties() 时,该runnable会被最后一个等待的线程去跑。

 

 

关于reset()方法:


调用该方法时,若有线程等待在await方法上,则这些线程都会收到一个BrokenBarrierException异常。

 

关于isBroken()方法:

只要任何一个等待在await()方法上的线程非正常地从await()上返回,那么isBroken()就返回true。

 

示例:


说明:两个人AAA、BBB,分别以1m/s、2m/s速度跑,若跑到6m处时还有人未到达6m处,则等待所有人都到达时才出发。跑完10m结束

package cyclicbarrier;

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

public class RunningMan implements Runnable{
	
	private int speed; // 1 m/s
	private int waitAfterMeters; // m
	private int totalMeters; // m
	private String name;
	
	private CyclicBarrier barrier;
	
	public RunningMan(int speed, int waitAfterMeters, int totalMeters) {
		this.speed = speed;
		this.waitAfterMeters = waitAfterMeters;
		this.totalMeters = totalMeters;
	}
	
	public RunningMan barrier(CyclicBarrier barrier) {
		this.barrier = barrier;
		return this;
	}
	
	public RunningMan name(String name) {
		this.name = name;
		return this;
	}
	
	private boolean needToWait() {
		return barrier != null;
	}
	
	private long time() {
		return System.currentTimeMillis() / 1000;
	}
	
	@Override
	public void run() {
		System.out.println(time() + ": runningman " + name + " start running.");
		int ranMiles = 0;// 跑了多少m
		while (ranMiles < totalMeters) {
			// 跑1s
			try {
				Thread.sleep(1000 * 1);
			} catch (InterruptedException e) {
				// 当前线程被中断了,那就不跑了
				Thread.currentThread().interrupt();
				break;
			}
			//计数
			ranMiles += speed;
			//是否到达指定等待点
			if (ranMiles == waitAfterMeters) {
				if (!needToWait()) { //没有barrier
					continue;
				}
				
				// 是否是最后一个到达指定等待点的
				if (barrier.getNumberWaiting() + 1 == barrier.getParties()) {
					System.out.println(time() + ": runningman " + name + " is the last one reached at " + waitAfterMeters);
				} else {
					System.out.println(time() + ": runningman " + name + " reached at " + waitAfterMeters + ", waiting for others");
				}
				// 等待, 直到barrier.getNumberWaiting() == barrier.getParties()时返回
				try {
					barrier.await();
				} catch (InterruptedException e) {
					// 当前线程被中断了,那就不跑了
					Thread.currentThread().interrupt();
					break;
				} catch (BrokenBarrierException e) {
					System.err.println("someone reset the barrier state.");
					break;
				}
			} else {
				System.out.println(time() + ": runningman " + name + " reached at " + ranMiles);
			}
		}
		System.out.println(time() + ": runningman " + name + " done running.");
	}
	
	public static void main(String[] args) {
		CyclicBarrier barrier = new CyclicBarrier(2);
		RunningMan rm1 = new RunningMan(1, 6, 10).name("AAA").barrier(barrier);
		RunningMan rm2 = new RunningMan(2, 6, 10).name("BBB").barrier(barrier);
		Thread t1 = new Thread(rm1);
		Thread t2 = new Thread(rm2);
		t1.start();
		t2.start();
	}
}

 结果:

 

 

 

  • 大小: 7.6 KB
  • 大小: 31.2 KB
  • 大小: 43.3 KB
1
1
分享到:
评论

相关推荐

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

    主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka

    『死磕Java并发编程系列』07 人齐了一起干CyclicBarrier 『死磕Java并发编程系列』08 限量供应Semaphore 『死磕Java并发编程系列』09 一手交钱一手交货Exchange 内存泄露的原因找到了,罪魁祸首居然是Java ...

    Java并发编程原理与实战

    并发容器ConcurrentLinkedQueue原理与使用.mp4 Java中的阻塞队列原理与使用.mp4 实战:简单实现消息队列.mp4 并发容器ConcurrentHashMap原理与使用.mp4 线程池的原理与使用.mp4 Executor框架详解.mp4 实战:简易web...

    Java并发编程相关技术使用案例

    1、本资源包含并发编程基础知识的使用案例,包括:线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的...

    龙果 java并发编程原理实战

    龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...

    Java并发编程学习笔记

    7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...

    龙果java并发编程完整视频

    第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:11:07分钟 | 第51节并发容器ConcurrentHashMap原理与使用00:38:...

    Java并发编程基础.pdf

    Java并发编程基础主要包括以下几个核心方面: 线程与线程状态:理解Java中线程的基本概念,包括线程的创建、启动、暂停、恢复和终止。熟悉线程的生命周期及其不同状态,如新建、就绪、运行、阻塞和死亡。 线程同步...

    Java 并发编程原理与实战视频

    java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    Java并发编程之栅栏(CyclicBarrier)实例介绍

    主要介绍了Java并发编程之栅栏(CyclicBarrier)实例介绍,栅栏类似闭锁,但是它们是有区别的,需要的朋友可以参考下

    Java并发编程(22)并发新特性-障碍器CyclicBa

    Java并发编程(22)并发新特性—障碍器CyclicBarrier(含代码)编程开发技术共3页.pdf.zip

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 CountDownLatch、CyclicBarrier、Semaphore这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下

    java并发编程

    第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:11:07分钟 | 第51节并发容器ConcurrentHashMap原理与使用00:38:...

    汪文君高并发编程实战视频资源全集

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

Global site tag (gtag.js) - Google Analytics