多线程进阶之并发工具类:CountDownLatch、CyclicBarrier
2015-07-20 18:22
316 查看
并发工具类在java.util.concurrent包下。常用的有CountDownLatch、CyclicBarrier,用它们可以控制并发流程。
1.CountDownLatch探究:
主要用到其两个实例方法:countDown()和await(),这两个方法配合使用,效果等同于Thread实例的join方法:
案例:有两个子线程,让这两个子线程执行完之后再执行主线程。
使用join:
使用CountDownLatch工具类:主要用到await()方法和countDown()方法
CountDownLatch类只有一个构造器CountDownLatch(int count),需要传入一个正整数,这个正整数就代表计数器。在主线程中调用了CountDownLatch实例的await()方法,主线程进入阻塞状态,只有等计数器变为0的时候才会解除阻塞。而在每个子线程中都调用了CountDownLatch实例的countDown()方法,每调用一次CountDownLatch实例的countDown()方法,CountDownLatch实例的计数器就会减1,如果能减到0,则主线程解除阻塞,如果减不到0(比如一开始计数器是3,而两个子线程各自只调用了一次CountDownLatch实例的countDown()方法),则主线程会一直阻塞,所以在一开始创建CountDownLatch的实例时要设计好到底要传多大的数进去。
2.CyclicBarrier探究:主要用到int await()方法和
CyclicBarrier字面意思是可循环使用的屏障。它的作用是让线程到达屏障时被阻塞,直到指定数量的线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续往下执行。
以上,先用CyclicBarrier(int parties)构造器创建了一个会阻塞2个线程的CyclicBarrier实例。在子线程中和主线程中都调用了CyclicBarrier实例的await()方法,不管先在哪个线程中调用,该线程都会被屏障阻塞,直到CyclicBarrier实例的await()方法在另一个线程中被调用,之后屏障打开,两个线程剩下的代码接着执行。同CountDownLatch工具类相似的是,如果调用CyclicBarrier实例await()方法的线程数小于创建CyclicBarrier实例时传入的参数,则调用CyclicBarrier实例await()方法的线程将一直阻塞,因为屏障打不开,但是其他线程可以接着执行,如果还有其他线程的话。
1.CountDownLatch探究:
主要用到其两个实例方法:countDown()和await(),这两个方法配合使用,效果等同于Thread实例的join方法:
案例:有两个子线程,让这两个子线程执行完之后再执行主线程。
使用join:
public class JoinTest { public static void main(String[] args) { Thread thread1 = new Thread(new Runnable() { public void run() { System.out.println(Thread.currentThread().getName() + "执行"); } }, "线程1"); Thread thread2 = new Thread(new Runnable() { public void run() { System.out.println(Thread.currentThread().getName() + "执行"); } }, "线程2"); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "执行"); } }
使用CountDownLatch工具类:主要用到await()方法和countDown()方法
public class DownCountLatchTest { static CountDownLatch c = new CountDownLatch(2); public static void main(String[] args) { new Thread(new Runnable() { public void run() { System.out.println(Thread.currentThread().getName() + "执行结束"); c.countDown(); } }, "线程1").start(); new Thread(new Runnable() { public void run() { System.out.println(Thread.currentThread().getName() + "执行结束"); c.countDown(); } }, "线程2").start(); try { c.await(); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "执行"); } }
CountDownLatch类只有一个构造器CountDownLatch(int count),需要传入一个正整数,这个正整数就代表计数器。在主线程中调用了CountDownLatch实例的await()方法,主线程进入阻塞状态,只有等计数器变为0的时候才会解除阻塞。而在每个子线程中都调用了CountDownLatch实例的countDown()方法,每调用一次CountDownLatch实例的countDown()方法,CountDownLatch实例的计数器就会减1,如果能减到0,则主线程解除阻塞,如果减不到0(比如一开始计数器是3,而两个子线程各自只调用了一次CountDownLatch实例的countDown()方法),则主线程会一直阻塞,所以在一开始创建CountDownLatch的实例时要设计好到底要传多大的数进去。
2.CyclicBarrier探究:主要用到int await()方法和
CyclicBarrier字面意思是可循环使用的屏障。它的作用是让线程到达屏障时被阻塞,直到指定数量的线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续往下执行。
public class CyclicBarrierTest { static CyclicBarrier c = new CyclicBarrier(2); public static void main(String[] args) { new Thread(new Runnable() { public void run() { try { c.await(); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "执行"); } }, "线程1").start(); try { c.await(); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "执行"); } }
以上,先用CyclicBarrier(int parties)构造器创建了一个会阻塞2个线程的CyclicBarrier实例。在子线程中和主线程中都调用了CyclicBarrier实例的await()方法,不管先在哪个线程中调用,该线程都会被屏障阻塞,直到CyclicBarrier实例的await()方法在另一个线程中被调用,之后屏障打开,两个线程剩下的代码接着执行。同CountDownLatch工具类相似的是,如果调用CyclicBarrier实例await()方法的线程数小于创建CyclicBarrier实例时传入的参数,则调用CyclicBarrier实例await()方法的线程将一直阻塞,因为屏障打不开,但是其他线程可以接着执行,如果还有其他线程的话。
相关文章推荐
- C语言逻辑运算小程序
- 支付宝&海淘支付宝
- FC总线技术简介
- FC总线技术简介
- ajax提交form表单资料详细汇总
- 通过vmware安装Ubuntu14.04 实现全屏显示 搭建samba服务器 安装搜狗输入法 搭建vs2013
- FC总线技术简介
- BJFU 1271 惊讶N
- FC总线技术简介 分类: 生活百科 2015-07-20 18:21 273人阅读 评论(0) 收藏
- MySQL的备份与恢复
- 解决MySQL重装之后,start service未响应的问题
- 算法之递归思想
- 几种placeholder替换项目参数的方法比较
- PHP计划任务:如何使用Linux的Crontab执行PHP脚本(转)
- 欢迎使用CSDN-markdown编辑器
- ios中摄像头/相册获取图片,压缩图片
- 【Linux】ubutun14.04配置JDK1.8
- 在Command Line中使用TexturePacker
- Cannot load 32-bit SWT libraries on 64-bit JVM
- 《转》ceilometer的数据采集机制入门