`
nbkangta
  • 浏览: 431580 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

Java并发编程之CyclicBarrier实例

    博客分类:
  • Java
 
阅读更多

最近在看《Java并发编程实战》,对于想学习Java多线程编程的童鞋,我强烈推荐这本书。


书上在讲到JDK5提供的并发包下的条件锁,CyclicBarrier的时候并没有给出具体的代码实例。问了下谷老师,也没发现什么特别好的文章,那只能自己来写一个了。


提到CyclicBarrier,那么必须先说一下Barrier,中文翻译为栅栏。什么是栅栏?其实这个中文翻译已经非常形象了,栅栏是对一组线程进行管理的锁。可以把栅栏想象成为一堵墙,这堵墙在建造的时候就设计好了,一定要有N个人才能把他推倒。这里说的人也就是我们的线程了,人数不够的时候,这些人都会被挡在墙前面。1个人推不倒,2个人推不倒。。。。N-1个人也推不倒,一旦第N个人来了,那么这个墙就应声倒下。接下来,N个人就可以继续往前走了,N个线程可以继续执行。


截止成文,在最新的JDK7中,Barrier语义的实现也只有一个CyclicBarrier类,那么接下来我就用CyclicBarrier来造一个实例。设计的场景是这样的:有一天,Eric坐在星巴克,突然想找人进行一场6人局的三国杀,就开始打电话给牌友 Shawn, Stone, Ashlee, Susie和Law,这5个朋友肯定不会住在一个房子里面啦,每个人到星巴克都需要耗费不同的时间,三国杀牌局必须等到所有人到达了才能开始。


把每个参与三国杀的人抽象为SanGuoShaer类,代码如下


package SanGuoSha;

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

/**
 * 三国杀参与者
 * @author ERic
 *
 */
public class SanGuoShaer implements Runnable {
	
	private String name;
	//这位朋友到星巴克需要花费的时间/h
	private int timeCost= 0;
	//每个参与者必须持有CyclicBarrier的实例
	private CyclicBarrier barrier;
	
	public SanGuoShaer(String name, CyclicBarrier barrier) {
		this.name = name;
		this.barrier = barrier;
		//需要的时间随机产生, + 1 是为了避免产生0
		this.timeCost = (int) ( Math.random() * 10 + 1);
		System.out.println(name + " 接到电话!");
	}

	@Override
	public void run() {
		try{
			System.out.println(name + " 准备出门了!");
			//1秒移动1小时路程!这朋友没有瞬移,每次运行真的花几个小时,大家都受不了
			Thread.sleep(timeCost * 1000);
			System.out.println(name + " 已经到了");
			//询问”大家都到了吗?"
			barrier.await();
			System.out.println(name + "开始抓手牌!");
		}catch(InterruptedException e){
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
	}

}

      构造函数执行的时候也就是这位童鞋接到发起人Eric电话的时候,这时TA知道了这件事,于是准备出门。

  路上具体要花多少时间,这里产生一个1-10的随机数表示。

  run函数中,这位童鞋先出门,然后花了一定的时间在路上,然后到了星巴克

  barrier.await();

  这位童鞋也点了饮料,坐下等着其他童鞋到,一旦其他同学到了,就是开始抓手牌。


   发起人Eric自然要辛苦点,要承担起通知其他同学,统计到的人数,准备到齐时候的牌堆等等。在统计人数的时候千万别忘记了,自己也要算上,所以CyclicBarrier是6个人不是5个人


    package SanGuoSha;

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

/**
 * 发起人
 * @author ERic
 *
 */
public class Originator {
	
	public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
		String myName = "Eric";
		System.out.println(myName + " 在星巴克: 要不组织个三国杀吧?");
		//那么,召开个6人局吧,还需要等5个人
		//那个runnable的inner class是在人到齐,每个人各自行动之前执行
		CyclicBarrier barrier = new CyclicBarrier(6, new Runnable() {
			@Override
			public void run() {
				System.out.println("三国杀开始啦,牌堆拿出来的干活~");
			}
		});
		
		//给shawn, stone, ashlee, susie, law打电话约
		//每个人接到电话都开始出门
		new Thread(new SanGuoShaer("Shawn", barrier)).start();
		new Thread(new SanGuoShaer("Stone", barrier)).start();
		new Thread(new SanGuoShaer("Ashlee", barrier)).start();
		new Thread(new SanGuoShaer("Susie", barrier)).start();
		new Thread(new SanGuoShaer("Law", barrier)).start();
		
		
		//等人来
		System.out.println(myName + " 开始喝着咖啡,唱着歌,等人来杀~");
		barrier.await();
		System.out.println(myName + "开始抓手牌");
	}
}



    控制台的输出如下,也许你运行的结果跟我不一样,这是正常的~

  Eric 在星巴克: 要不组织个三国杀吧?

Shawn 接到电话!
Stone 接到电话!
Ashlee 接到电话!
Shawn 准备出门了!
Susie 接到电话!
Ashlee 准备出门了!
Susie 准备出门了!
Stone 准备出门了!
Law 接到电话!
Eric 开始喝着咖啡,唱着歌,等人来杀~
Law 准备出门了!
Stone 已经到了
Ashlee 已经到了
Shawn 已经到了
Law 已经到了
Susie 已经到了
三国杀开始啦,牌堆拿出来的干活~
Susie开始抓手牌!
Eric开始抓手牌
Stone开始抓手牌!
Ashlee开始抓手牌!
Shawn开始抓手牌!
Law开始抓手牌!

 

    欢迎各位童鞋来交流~


 

分享到:
评论

相关推荐

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

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

    java并发编程2

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

    Java 并发编程实战.pdf

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

    java并发编程实践pdf笔记

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

    java并发编程

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

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

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

    Java并发编程实践 高清扫描版

    《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发和多线程是现代计算机系统中不可或缺的部分,特别是在Java这样的多线程支持语言中。本书详细介绍了如何在Java环境中有效地设计和实现...

    Java 并发编程实战(高清带目录).zip

    详细讲解了Java并发库中的关键类和接口,如Thread、Runnable、ExecutorService、Future、Semaphore、CyclicBarrier、CountDownLatch、Exchanger以及Lock(ReentrantLock、ReadWriteLock)等,这些都是Java并发编程中...

    java并发编程实战.zip

    总的来说,《Java并发编程实战》这本书不仅提供了丰富的理论知识,还通过大量的实例源码帮助读者将理论付诸实践,是Java开发者提升并发编程技能的必备参考。通过学习书中的内容,开发者能够更好地理解和掌握Java并发...

    Java并发编程实践(Java Concurrency in Practice) (中英版)

    《Java并发编程实践》是Java开发者深入理解和应用并发编程的权威指南,这本书全面覆盖了Java并发编程的各种核心概念和技术,旨在帮助程序员编写出高效、安全的并发代码。书中的内容既包括理论知识,也包含丰富的实战...

    Java并发编程的艺术

    第八章关注于Java提供的并发工具类,这些工具类包括CountDownLatch、CyclicBarrier、Semaphore等,它们是Java并发编程库的重要组成部分。本章不仅详细介绍了这些工具类的功能和用途,还提供了一系列实用的例子,帮助...

    Java并发编程的设计原则与模式

    本文将深入探讨Java并发编程的设计原则与模式,旨在帮助开发者理解并有效地应用这些原则和模式。 一、并发编程的基础概念 并发是指两个或多个操作在同一时间间隔内执行,而不是严格意义上的同一时刻。在Java中,...

    Java并发编程_设计原则和模式(CHM)

    Java并发编程是软件开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。本资源"Java并发编程_设计原则和模式(CHM)"聚焦于Java语言在并发环境下的编程技巧、...

    JAVA并发编程实践 EN(全)

    1. **并发基础**:介绍Java并发编程的基本概念,包括线程、进程、同步与互斥、死锁等。读者将了解Java中Thread类和Runnable接口的使用,以及如何创建和管理线程。 2. **线程安全**:讨论线程不安全的代码示例,以及...

    JAVA并发编程实践

    《JAVA并发编程实践》是一本深入探讨Java并发编程技术的权威指南,涵盖了从基础理论到实战技巧的全方位内容。本书由多位资深Java并发编程专家共同编写,旨在帮助开发者理解和掌握Java并发编程的核心概念与最佳实践。...

    Java并发编程与高并发解决方案(高清视频教程).rar

    本教程的高清视频将通过实例讲解以上概念,并提供实战经验,帮助开发者更好地理解和掌握Java并发编程,提升高并发解决方案的设计能力。阅读提供的"Java并发编程与高并发解决方案(高清视频教程).txt"文件,可以...

    《Java7并发编程实战手册》书中实例代码

    总之,《Java 7并发编程实战手册》的实例代码为开发者提供了一个实践和学习并发编程的宝贵资源,帮助他们更好地掌握Java并发编程的核心技术,提升程序的性能和可维护性。通过详细研究这些代码,开发者可以更自信地...

    Java并发实例之CyclicBarrier的使用

    Java并发实例之CyclicBarrier的使用 CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier...

Global site tag (gtag.js) - Google Analytics