java学习笔记.05——CyclicBarrier和CountDownLatch
2015-11-01 14:30
417 查看
一、CyclicBarrier
【概念】有多个线程,每个线程执行并等待所有线程都完成某项任务,之后所有线程才能继续往后执行
【用法】
在每个要设定的线程中的某处设定一个集合信号,每个被设定的线程执行到自身信号处时会暂停等待,当所有被设定的线程都执行到自身的信号地点时所有线程继续执行各自任务。
[Method]
–await() // 设定信号
/** * 下面的代码运行后,如果t1打印出hello 1、hello2而t2还未打印 * 出hello 1,t1会等待t2执行打印出hello 1再向下执行。 * 当t1和t2都执行到cb.await()处时,t1和t2 */ CyclicBarrier cb = new CyclicBarrier(2); Thread t1 = new Thread(new Runnable() { @override public void run() { System.out.println("hello 1"); System.out.println("hello 2"); cb.await(); System.out.println("hello 3"); } }); Thread t2 = new Thread(new Runnable() { @override public void run() { System.out.println("hello 1"); cb.await(); System.out.println("hello 2"); } }); t1.start(); t2.start();
二、CountDownLatch
【概念】一批线程等待另一批线程都执行到某个点后开始执行
【用法】
一部分线程先执行,一部分线程后执行。在每个先执行的线程中都设定一个地点,设定线程执行到该地点时会将计数器的值减1。在每个等待的线程中设定一个地点(通常是开头),当计数器的值为0时,所有等待计数器的线程从设定地点开始执行。 注意,先执行的线程和等待被执行的线程内没有固定顺序。
[Constructor]
CountDownLatch cdl = new CountDownLatch(n); // n是要先执行的线程数
[Method]
–countdown() // 计数器的值减1
–await() // 等待所有先执行的线程执行完毕
/** * 当t3,t4执行到await()处时暂停,等待t1,t2执行到countdown() * t1或t2执行到countdown(),等待另一个也执行到countdown()。 * t1和t2都执行到countdown()处 * t3,t4继续执行 */ CountDownLatch cdl = new CountDownLatch(2); Thread t1 = new Thread(new Runnable() { @override public void run() { System.out.println("hello 1"); System.out.println("hello 2"); cbl.countdown(); System.out.println("hello 3"); } }); Thread t2 = new Thread(new Runnable() { @override public void run() { System.out.println("hello 1"); System.out.println("hello 2"); cbl.countdown(); System.out.println("hello 3"); } }); Thread t3 = new Thread(new Runnable() { @override public void run() { cb.await(); System.out.println("hello 1"); System.out.println("hello 2"); } }); Thread t4 = new Thread(new Runnable() { @override public void run() { System.out.println("hello 1"); cb.await(); System.out.println("hello 2"); System.out.println("hello 3"); } }); t1.start(); t2.start(); t3.start(); t4.start();
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统