- 浏览: 276868 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
CodeLove:
如果包含<,(,)...等特殊字符呢
Python变量名检测 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,只能算是 2、8、10、16 几 ...
java实现的任意进制转换 -
mychaoyue2011:
在本地执行了几遍,结果都是:s2开始休眠s1开始休眠s2休眠结 ...
Java线程学习笔记(四)线程join -
chxiaowu:
不错!
Java版的树 -
TenAclock:
这个例子 做不到“学生都交完” 考试结束,只能做到等到考试时间 ...
Java线程学习笔记(十一) DelayQueue的应用
CountDownLatch :
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
用给定的计数 初始化 CountDownLatch。由于调用了 countDown()
方法,所以在当前计数到达零之前,await
方法会一直受阻塞。之后,会释放所有等待的线程,await
的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。
CountDownLatch 很适合用来将一个任务分为n个独立的部分,等这些部分都完成后继续接下来的任务,CountDownLatch 只能出发一次,计数值不能被重置。
CyclicBarrier:
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier可以多次重复使用
下面是两个例子,一个为基于CountDownLatch 的模拟项目,一个项目可以分为多个模块,只有但这些模块都完成后才可以继续下一步的工作。
一个为基于CyclicBarrier的接力赛模拟,有四个队员,当跑完后报出最终成绩。
package com.woxiaoe.study.thread; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * 模拟项目的开发,只有当每个模块都完成后,项目才完成 * 每个模块的用时不同 * @author 小e * * 2010-4-30 下午07:41:37 */ class Module implements Runnable{ private CountDownLatch latch; private String moduleName; private int time;//用时 public Module(CountDownLatch latch, String moduleName,int time) { super(); this.latch = latch; this.moduleName = moduleName; this.time = time; } @Override public void run() { try { work(); latch.countDown(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void work() throws InterruptedException{ TimeUnit.MILLISECONDS.sleep(time); System.out.println(moduleName + " 完成,耗时:" + time); } } class Controller implements Runnable{ private CountDownLatch latch; public Controller(CountDownLatch latch) { super(); this.latch = latch; } @Override public void run() { try { latch.await(); System.out.println("所有模块都完成,任务完成"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class Project { static final int SIZE = 20; public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(SIZE); Random r = new Random(); ExecutorService exec = Executors.newCachedThreadPool(); Controller controller = new Controller(latch); exec.execute(controller); for(int i = 0; i < SIZE; i++){ exec.execute(new Module(latch, "模块" + (i + 1), r.nextInt(2000))); } exec.shutdown(); } }
Output:
模块4 完成,耗时:108 模块10 完成,耗时:123 模块7 完成,耗时:136 模块19 完成,耗时:235 模块5 完成,耗时:475 模块11 完成,耗时:653 模块1 完成,耗时:745 模块2 完成,耗时:826 模块20 完成,耗时:1030 模块16 完成,耗时:1151 模块3 完成,耗时:1204 模块15 完成,耗时:1219 模块13 完成,耗时:1274 模块17 完成,耗时:1337 模块8 完成,耗时:1366 模块6 完成,耗时:1491 模块14 完成,耗时:1739 模块18 完成,耗时:1766 模块12 完成,耗时:1883 模块9 完成,耗时:1951 所有模块都完成,任务完成
package com.woxiaoe.study.thread; import java.util.Random; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * 用java模拟4X100接力赛 * 当结束后 报成绩,应用CyclicBarrier * @author 小e * * 2010-4-30 下午08:13:40 */ class Player implements Runnable{ private String name; private CyclicBarrier barrier; private Player next;//下一棒 private int time;//用时 private boolean run;//第一棒 public Player(String name, CyclicBarrier barrier, boolean run) { super(); this.name = name; this.barrier = barrier; this.run = run; } @Override public void run() { try { synchronized (this) { while(!run){//等待队员 wait(); } } Random r = new Random(); TimeUnit.MILLISECONDS.sleep(r.nextInt(2000)); next(next,11 + r.nextInt(2)); } catch (InterruptedException e) { e.printStackTrace(); } } private void next(Player next, int time) { System.out.println(name + " 用时:" + time + ",交接棒"); if(next != null){ next.setTime(this.time + time); synchronized (next) { next.setRun(true); next.notify(); } }else{ System.out.println("跑完,总用时:" + (this.time + time)); } } public void setTime(int time) { this.time = time; } public int getTime(){ return this.time; } public void setNext(Player next) { this.next = next; } public void setRun(boolean run) { this.run = run; } } public class RelayRace { public static void main(String[] args) throws InterruptedException { final Player[] players = new Player[4]; ExecutorService exec = Executors.newCachedThreadPool(); CyclicBarrier barrier = new CyclicBarrier(4, new Runnable() { @Override public void run() { System.out.println("结束,总用时:" + players[3].getTime()); } }); for(int i = 0; i < 4; i++){ players[i] = new Player("队员" + ( i + 1), barrier, i == 0); } for(int i = 0; i < 4; i++){ if( i < 3){ players[i].setNext(players[i + 1]); exec.execute(players[i]); }else{ exec.execute(players[3]); break; } } /*TimeUnit.SECONDS.sleep(3); * CyclicBarrier 可以重用 for(int i = 0; i < 4; i++){ if( i < 3){ players[i].setNext(players[i + 1]); exec.execute(players[i]); }else{ exec.execute(players[3]); break; } }*/ } }
- src.rar (2.1 KB)
- 下载次数: 155
评论
对啊!
既然你用了concurrent包,为什么还要调用wait()?
此贴还被投了“良好贴”?
对啊!
既然你用了concurrent包,为什么还要调用wait()?
CountDownLatch: 一个或者是一部分线程 ,等待另外一部线程都完成了,再继续执行
CyclicBarrier: 所有线程互相等待完成。
我觉得楼主的CyclicBarrier的例子不太好,如果目的是讲CyclicBarrier的话,不如讲4个人一起跑,等4个人都跑到终点了,才可以去吃饭……
package com.wl.test.concurrent.cyclicbarrier; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @author HardPass * */ public class CyclicBarrierTest_RelayRace { public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); final CyclicBarrier barrier = new CyclicBarrier(4, new Runnable() { @Override public void run() { System.out.println("好了,大家可以去吃饭了……" ); } }); System.out.println("要吃饭,必须所有人都到终点,oK?"); System.out.println("不放弃不抛弃!"); for (int i = 0; i < 4; i++) { exec.execute(new Runnable() { @Override public void run() { System.out .println(Thread.currentThread().getName() + ":Go"); try { Thread.sleep((long) (2000 * Math.random())); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":我到终点了"); try { barrier.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":终于可以吃饭啦!"); } }); } exec.shutdown(); } }
发表评论
-
Consider the following code: What will be printed?
2010-09-24 20:30 943Consider the following code: Wh ... -
Java 基础复习笔记一
2010-06-04 02:03 1113这两天复习java的基础知识,把一些自己认为比较有用的点记录下 ... -
Java 转义字符
2010-06-03 21:21 978\n 回车(\u000a) \t 水平制表符(\u0009) ... -
生产消费者的模拟
2010-05-27 23:16 1633采用Java 多线程技术,设计实现一个符合生产者和消费者问题的 ... -
Java 控制台下显示文件结构
2010-05-27 00:10 3239题目: 编写一个Java ... -
Java得到类目录
2010-05-26 23:22 1162String path = MainTest.class.ge ... -
Java文件压缩
2010-05-23 21:54 1203package com.woxiaoe.study.io ... -
UDP传输图片的尝试
2010-05-22 18:05 9795UDP是不可靠的,发送的数据不一定会到达,且顺序不一定 ... -
【转载】Java String.Format() 方法及参数说明
2010-05-15 22:18 1304JDK1.5中,String类新增了一个很有用的静态方法S ... -
【转载】String.format函数使用方法介绍
2010-05-15 22:17 1170http://edu.codepub.com/2009/111 ... -
Java线程学习笔记(十一) DelayQueue的应用
2010-05-01 00:34 15588DelayQueue 是一个无界的BlockingQueue ... -
Java线程学习笔记(九)生产者消费者问题
2010-04-29 22:27 1695用多线程来模拟生产者消费者问题。用到BlockingQueue ... -
Java线程学习笔记(八)线程之间的协作
2010-04-26 23:13 1761wait()与notifyAll() 调用sleep ... -
Java线程学习笔记(七)java中递增不是原子性
2010-04-24 23:00 2896以下为测试代码,通过一个自增函数得到最新的值,玩Set你存,看 ... -
Java线程学习笔记(六)在其他对象上同步
2010-04-24 22:47 1338package com.woxiaoe.study.threa ... -
Java线程学习笔记(五)资源共享问题
2010-04-24 21:04 1252IncreaseClient 中持有一个base,每次调用起i ... -
Java线程学习笔记(四)线程join
2010-04-24 20:06 1265《Java编程思想》的一个例子,如果某个线程在另一个线程t上调 ... -
基于java的图(四) 强连通组件
2010-04-22 21:06 1526有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一 ... -
基于java的图(三) 图的拓扑排序
2010-04-21 16:14 1856相关: 基于java的图的实现 基于java ... -
基于java的图的实现(二) 图的两种遍历
2010-04-20 21:51 2086图的实现见http://www.iteye.com/topic ...
相关推荐
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf
java并发编程中CountDownLatch和CyclicBarrier的使用.pdf
CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。
Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 CountDownLatch、CyclicBarrier、Semaphore这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发...
主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
java 高并发应用场景
主要介绍了Java线程并发工具类CountDownLatch原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...
JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于...并发工具类:JUC提供了一些并发编程的工具类,如Semaphore、CountDownLatch、CyclicBarrier等,可以实现线程间的协作和同步。
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+...
在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:
利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949
目录: 简介 1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 ...CountDownLatch与CyclicBarrier的对比 最佳实践与注意事项
1. 什么是线程? 2. 线程和进程有什么区别? 3. 如何在 Java 中实现...7. Java 中 CyclicBarrier 和 CountDownLatch 有什么不同? 8. Java 内存模型是什么? 9. Java 中的 volatile 变量是什么? ......... ........
主要介绍了Java多线程编程之CountDownLatch同步工具使用实例,需要的朋友可以参考下
Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。