- 浏览: 430516 次
- 性别:
- 来自: 宁波
文章分类
最新评论
-
coosummer:
推荐使用http://buttoncssgenerator.c ...
11大CSS按钮教程 -
a754782339:
楼主你好,我现在遇到的问题就是json与hibernate使 ...
Json-lib 与 hibernate 共同使用的问题 -
ying890:
非常感谢!
Extjs 处理 Date 对象 -
xa_zbl:
加了以后,报这个错误:TypeError: b[this.vt ...
ExtJs自定义Vtype示例 -
nbkangta:
dampce032 写道如果我想取到Person下Addres ...
Json-lib 与 hibernate 共同使用的问题
最近在看《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复制文件内容NIO版本
2013-06-25 21:06 1415网上的文件操作目前都停留在老的IO API当中,这大概就是 ... -
Java 用泛型实现元组
2013-03-10 10:27 0Python, Ruby等动态语言的流行,我认为其中很大的一 ... -
试着解释神奇的7循环
2013-03-01 19:13 1119作为一名非计算机科班出身的程序员对计算机的底层架构知之甚少, ... -
Maven集成Jetty使用resteasy无法使用的问题
2013-02-12 14:44 2330最近在学习JAX-RS, 使用的是Jboss的 restea ... -
经常要忘记。。。Ubuntu install jdk 7
2013-01-14 20:33 943来自 http://blog.csdn.net/yang_h ... -
常见数字类型long, int, short和byte数组的转换
2012-11-05 17:13 1794show you the code~! /** * ... -
Java系统属性
2012-10-22 11:31 2292似乎从来没仔细看过java System.getPropert ... -
Java并发编程实践之Executor框架
2012-10-20 18:19 940java中任务的抽象不是Thread,而是Executor! ... -
《重构——改善既有代码的设计》读书笔记
2012-08-04 13:39 1252最近公司开展读书月活动,免费提供书籍要求读完上交读书笔记一篇 ... -
使用 Eclipse Memory Analyzer 进行堆转储文件分析
2010-12-26 00:00 1670转自IBM DEVELOPER WORKS 对于大型 J ... -
java常见笔试题
2009-12-03 12:52 1328第一,谈谈final, finally, ... -
Myeclipse部署项目到服务器时,WEB-INF\classes中无文件解决方法
2009-07-08 10:49 6335今天重新从SVN将项目迁出了一下,在用Myeclipse部署项 ... -
JDBC获取数据库所有表
2009-06-21 15:49 9239当初在JDBC还没研究透的时候,就偷懒去用了hibernate ... -
[Jakarta Commons] 使用StringUtil类
2009-02-17 17:47 1370原文地址:http://www.blogjava.net/zJ ... -
Json-lib 如何转换日期格式的字段 json
2009-02-11 19:54 4930json : {password:"234234&q ... -
用 GlassFish v2 替换 Tomcat 5.x
2009-01-24 22:17 1800羡慕ROR的热部署啊,无论修改什么基本都可以热部署,tomca ... -
文件操作类
2009-01-04 16:47 1931把网上的文件操作类整合了一下,算是转帖 package ... -
Hibernate Gossip: Criteria 進階查詢
2008-12-29 00:51 1214使用Criteria進行查詢時,不僅僅能組合出SQL中wher ... -
Hibernate3的DetachedCriteria支持
2008-12-29 00:02 1171作者:robbin出处:Java视线责任编辑:方舟 居然隔了 ... -
String2 中的ActionContext引起的问题
2008-12-25 14:55 1334在Action中获取URL参数 String id = Ac ...
相关推荐
Java并发编程(CyclicBarrier)实例详解 Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...
Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分利用系统资源并避免潜在的并发问题。 一、并发编程基础 并发是指两个或多个操作在同一时间段内执行,但并不意味着这些...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发和多线程是现代计算机系统中不可或缺的部分,特别是在Java这样的多线程支持语言中。本书详细介绍了如何在Java环境中有效地设计和实现...
详细讲解了Java并发库中的关键类和接口,如Thread、Runnable、ExecutorService、Future、Semaphore、CyclicBarrier、CountDownLatch、Exchanger以及Lock(ReentrantLock、ReadWriteLock)等,这些都是Java并发编程中...
总的来说,《Java并发编程实战》这本书不仅提供了丰富的理论知识,还通过大量的实例源码帮助读者将理论付诸实践,是Java开发者提升并发编程技能的必备参考。通过学习书中的内容,开发者能够更好地理解和掌握Java并发...
《Java并发编程实践》是Java开发者深入理解和应用并发编程的权威指南,这本书全面覆盖了Java并发编程的各种核心概念和技术,旨在帮助程序员编写出高效、安全的并发代码。书中的内容既包括理论知识,也包含丰富的实战...
第八章关注于Java提供的并发工具类,这些工具类包括CountDownLatch、CyclicBarrier、Semaphore等,它们是Java并发编程库的重要组成部分。本章不仅详细介绍了这些工具类的功能和用途,还提供了一系列实用的例子,帮助...
本文将深入探讨Java并发编程的设计原则与模式,旨在帮助开发者理解并有效地应用这些原则和模式。 一、并发编程的基础概念 并发是指两个或多个操作在同一时间间隔内执行,而不是严格意义上的同一时刻。在Java中,...
Java并发编程是软件开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。本资源"Java并发编程_设计原则和模式(CHM)"聚焦于Java语言在并发环境下的编程技巧、...
1. **并发基础**:介绍Java并发编程的基本概念,包括线程、进程、同步与互斥、死锁等。读者将了解Java中Thread类和Runnable接口的使用,以及如何创建和管理线程。 2. **线程安全**:讨论线程不安全的代码示例,以及...
《JAVA并发编程实践》是一本深入探讨Java并发编程技术的权威指南,涵盖了从基础理论到实战技巧的全方位内容。本书由多位资深Java并发编程专家共同编写,旨在帮助开发者理解和掌握Java并发编程的核心概念与最佳实践。...
本教程的高清视频将通过实例讲解以上概念,并提供实战经验,帮助开发者更好地理解和掌握Java并发编程,提升高并发解决方案的设计能力。阅读提供的"Java并发编程与高并发解决方案(高清视频教程).txt"文件,可以...
总之,《Java 7并发编程实战手册》的实例代码为开发者提供了一个实践和学习并发编程的宝贵资源,帮助他们更好地掌握Java并发编程的核心技术,提升程序的性能和可维护性。通过详细研究这些代码,开发者可以更自信地...
Java并发实例之CyclicBarrier的使用 CyclicBarrier是Java中的一种多线程并发控制实用工具,和CountDownLatch非常类似,它也可以实现线程间的计数等待,但是它的功能比CountDownLatch更加复杂且强大。CyclicBarrier...