- 浏览: 519522 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (161)
- 多线程与并发编程 (20)
- 算法和数据结构 (8)
- 缓存 (0)
- HttpClient (2)
- 疑难杂症 (11)
- Java内存管理 (17)
- 分布式开发 (14)
- Linux常用命令 (10)
- OSGI (0)
- UML (2)
- 趣味面试题 (5)
- 设计模式 (8)
- Java类加载 (2)
- JSTL (1)
- Web 服务器 (4)
- IT人生 (3)
- Java基础 (11)
- Flash技术 (7)
- 新知识 (3)
- 常用速备速查 (4)
- 版本控制 (1)
- Java集合工具类 (6)
- web前端技术 (1)
- 趣味话题 (1)
- 安全 (0)
- 架构设计 (5)
- Spring (4)
- 负载均衡技术 (2)
- 持久层技术 (2)
- MySQL单机多实例方案 (1)
- 收藏备用 (0)
- 性能优化 (3)
最新评论
-
liuwuhen:
...
Pushlet的工作原理 -
fbwfbi:
fengchuizhuming 写道楼主的完全正确。鉴定完毕楼 ...
硬件同步原语(CAS)理论 -
passerby_whu:
uule 写道这个测试后结果为:“testPageConten ...
FutureTask的使用方法和使用实例 -
fengchuizhuming:
楼主的完全正确。鉴定完毕
硬件同步原语(CAS)理论 -
edwardjuice:
FutureTask的使用方法和使用实例
CountDownLatch
CountDownlatch,是一种Sychronizer,它可以延迟线程的进度直到线程的进度到线程到达终止状态。
它本身而言是Java并发包中非常有用的一个类,它可以让某些任务完成以后再继续运行下面的内容,每个任务本身执行完毕后让计数器减一,直到计数器清零后,以下的内容才可以继续运行,否则将阻塞等待。
想了一下,这个场景非常适合用于项目中这样的场景: 我们有个项目,它需要三个第三方的API,并把结果拿到,在一个线程中顺序去拿结果没有问题,但是这里这三个任务是非常耗时的操作,如果顺序获取性能非常差,因此可以考虑用三个线程,当三个线程拿到结果后才继续主线程的工作,等三个线程运行结束后,由主线程去取子线程运行的结果。 这里有个很重要的前提:我们的系统运行在4个cpu的server上,这样多线程才能体现性能,JVM会分配这些线程尽量运行在不同的cpu上。
CountDownLatch有以下基本方法:
1)await(),阻塞等待,直到计数器清零
2)await(int timeout, TimeUnit unit),使线程阻塞,除非被中断或者超过等待的最大时间
如果达到计数器清零,则await返回true,如果等待超过了最大的等待时间,则返回false
3)countDown(),计数器减一,当计数器清零时,await的线程被唤醒,线程继续执行
4)getCount (),获取当前计数器的大小
package countdownlatch;
import java.util.concurrent.CountDownLatch;
/**
*
*<p>Test</p>
*<p>Description:</P>
*<p>Company:</p>
*<p>Department:CAS</p>
*@Author: Tommy Zhou
*@Since: 1.0
*@Version:Date:2011-4-26
*
**/
public class CountDownLatchSample {
public static void main(String[] args) {
String[] strs = getResult();
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
public static String[] getResult(){
String[] strs = new String[3];
CountDownLatch countDownLatch = new CountDownLatch(3);
Work1 work1 = new Work1(countDownLatch,strs[0]);
Work2 work2 = new Work2(countDownLatch,strs[1]);
Work3 work3 = new Work3(countDownLatch,strs[2]);
work1.start();
work2.start();
work3.start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
strs[0] = work1.str1;
strs[1] = work2.str2;
strs[2] = work3.str3;
return strs;
}
}
class Work1 extends Thread{
public String str1;
public CountDownLatch latch1;
public Work1(CountDownLatch latch1,String str1){
this.latch1 = latch1;
this.str1 = str1;
}
public void run(){
str1="work1";
latch1.countDown();
}
}
class Work2 extends Thread{
public String str2;
public CountDownLatch latch2;
public Work2(CountDownLatch latch2,String str2){
this.latch2 = latch2;
this.str2 = str2;
}
public void run(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
str2="work2";
latch2.countDown();
}
}
class Work3 extends Thread{
public String str3;
public CountDownLatch latch3;
public Work3(CountDownLatch latch3,String str3){
this.latch3 = latch3;
this.str3 = str3;
}
public void run(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
str3="work3";
latch3.countDown();
}
}
发表评论
-
死锁实例
2011-05-19 14:21 1907下面这道题,是考死锁的,比较简单,想两个问题: 1.什么时候 ... -
Java存储模型
2011-05-18 13:29 01.什么是存储模型 没有适当的同步,编译器生成指令的次序,可 ... -
设计模式-组合模式
2011-05-16 15:48 1077组合模式的定义: 将对象组合成树的形式来表示整体和局部之 ... -
CompleteService介绍和使用实例
2011-05-11 17:31 3881当向Executor提交批处理任务时,并且希望在它们完成后获得 ... -
CyclicBarrier的使用实例
2011-05-11 15:45 1441CyclicBarrier允许给定数量的线程全部到达关卡点时, ... -
CopyOnWriteArrayList工作原理和实例
2011-05-05 23:43 3344CopyOnWriteArrayList顾名思义,在写入操作时 ... -
Semaphore的介绍和使用实例
2011-04-27 22:32 2771Semaphore可以用来控制能 ... -
FutureTask的使用方法和使用实例
2011-04-27 15:34 13262FutureTask是一种可以取消的异步的计算任务。它的计算是 ... -
Java 并发编程基础-共享对象
2011-04-19 14:48 1409Java 并发编程基础 ... -
从JVM并发看CPU内存指令重排序(Memory Reordering)
2011-04-18 16:17 1447我们都知道,现在的计算机, cpu 在计算的时候 ... -
Java并发编程基础
2011-04-15 14:55 1515Java 并发编程基 ... -
Java多线程基础
2011-04-13 15:52 4707Java 多线程基础 ... 2 ... -
硬件同步原语(CAS)理论
2010-09-24 22:13 6950在Java并发编程中,常常 ... -
java5中使用interrupt()来停止java线程的方法(转)
2010-08-18 23:24 3063在开发java多线程时,如果要停止线程这个问题很头痛吧,不过在 ... -
Java 中的Double Check Lock(转)
2010-07-27 21:13 8043对于多线程编程来说,同步问题是我们需要考虑的最多的问题,同步的 ... -
并发访问的问题解决方案
2010-07-26 18:15 1966目前正在做基于Red 5 的Meeting系统,我们会在Mee ... -
用并发包中的重入锁实现生产消费模型
2010-06-15 00:07 1399传统的生产消费模型,实际上是通过一个条件来调节生产者和消费者线 ... -
ThreadLocal原理(转)
2010-03-24 18:06 2128http://jzhua.iteye.com/blog/517 ... -
(转)Java偏向锁实现原理(Biased Locking)
2010-03-21 22:24 1334http://www.iteye.com/topic/5180 ... -
生产消费模型实例
2010-03-02 23:23 1674“生产者-消费者-仓储”模型,包含三种角色: 1.生产者 ...
相关推荐
- 其他 N 个线程必须引用闭锁对象,因为它们如果完成了任务需要通过 CountDownLatch.countDown() 方法来通知CountDownLatch实例,每次调用计数减少 1。当所有 N 个线程都调用了这个方法时,计数将达到 0,主线程...
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
主要介绍了Java多线程编程之CountDownLatch同步工具使用实例,需要的朋友可以参考下
主要介绍了Java CountDownLatch完成异步回调实例详解的相关资料,需要的朋友可以参考下
主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
主要介绍了JAVA CountDownLatch(倒计时计数器)用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java并发工具包实例,包含AQS,LOCK,countdownlatch ,atomic原子类等实例
有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore
主要介绍了java CountDownLatch的相关资料,文中示例代码非常详细,帮助大家理解和学习,感兴趣的朋友可以了解下
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
Concurrent下的例子,涵盖了大部分常用类 例如BlockingQueue、CountDownLatch、CyclicBarrier、Exchanger、ExecuteService、lock、timeutil等
淡褐色 Hazelcast是一个开源的分布式内存数据存储和... 使用Hazelcast形成集群非常简单,您只需启动多个实例就可以在计算机上轻松完成此操作。 实例将彼此发现并形成集群。 对任何外部系统都没有任何依赖性。 Hazelca
使用Callable对象实例化FutureTask类 信号量(Semaphore) 用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量 管理者一组虚拟的许可。acquire获得许可(相当于P操作),...
synchronized关键字加在静态方法和实例方法的区别; 用锁的注意点; cas机制可能导致的问题ABA,什么是ABA; 程序开多少线程合适; 实现一下DCL(双重检查锁) stream 和 parallelStream区别; 实现一个阻塞队列(用...
同步控制是并发程序必不可少的重要手段,本文我们将通过重入锁、读写锁、信号量、倒计数器和循环栅栏以及他们的实例来介绍Java并发程序中的同步控制。 目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ...
14.6.2 Semaphore与CountDownLatch258 14.6.3 FutureTask259 14.6.4 ReentrantReadWriteLock259 第15章 原子变量与非阻塞同步机制261 15.1 锁的劣势261 15.2 硬件对并发的支持262 15.2.1 比较并交换263 ...
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................