`

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 并发编程实战高清PDF版》

    在Java并发编程中,多线程是核心概念之一。多线程允许程序同时执行多个任务,从而充分利用系统资源,提高程序性能。然而,多线程编程也带来了同步和竞态条件等问题,这需要开发者具备良好的线程管理和同步机制的知识...

    java并发编程艺术

    《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...

    java并发编程2

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...

    Java 并发编程实战.pdf

    根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...

    java 并发编程的艺术pdf清晰完整版 源码

    《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    java并发编程实践pdf笔记

    Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    Java并发编程从入门到精通(pdf)(附源码)

    《Java并发编程从入门到精通》是一本专为Java开发者设计的深度学习并发编程的书籍。作者韩剑锋,凭借其12年的IT行业经验,曾担任多家IT公司的研发总监和技术总监,以其丰富的实战经验和深厚的理论知识,为读者提供了...

    java并发编程与实践

    "Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...

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

    Java并发编程(CyclicBarrier)实例详解 Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,...

    Java并发编程实践.pdf

    ### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...

    java并发编程

    Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...

    Java并发编程设计原则和模式

    本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分利用系统资源并避免潜在的并发问题。 一、并发编程基础 并发是指两个或多个操作在同一时间段内执行,但并不意味着这些...

    JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf

    根据提供的文件信息,“JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf”,我们可以推断出这份文档主要聚焦于Java并发编程的技术实践与理论探讨。下面将从多个角度来解析这个文档可能涵盖的关键知识点。 ...

    Java并发编程-3.pdf

    Java并发编程中的多线程协作机制 在 Java 并发编程中,多线程协作机制是非常重要的一部分。多线程协作机制是指在多线程编程中,多个线程之间如何协作、同步和通信,以达到共同完成某个任务的目的。Java 提供了多种...

    java并发编程实战高清版pdf

    《Java并发编程实战》是Java开发者深入理解和掌握并发编程的一本经典著作。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者在多核时代编写出高效、可伸缩且线程安全的代码。 并发编程是现代...

    Java并发编程从入门到精通源码.rar

    Java并发编程是Java开发中的重要领域,特别是在大型分布式系统、多线程应用和服务器端程序设计中不可或缺。这个资源包“Java并发编程从入门到精通源码.rar”显然是为了帮助开发者深入理解并掌握这一关键技能。它包含...

    Java并发编程相关资料

    Java并发编程是Java开发中的重要领域,涉及到多线程、同步机制、线程池等多个核心概念,对于构建高效、稳定的应用至关重要。这份资料包含了关于Java并发编程的博客和网页,可以提供深入的理解和实践指导。 在Java...

    Java并发编程常识-梁飞.rar

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。阿里大牛梁飞编写的《Java并发编程常识》PPT,深入浅出地讲解了这个主题,对开发者来...

Global site tag (gtag.js) - Google Analytics