java中的线程(4):常用同步类 CountDownLatch、CyclicBarrier和Semaphore
转自:
http://www.cnblogs.com/dolphin0520/p/3920397.html
1.简介
- CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同。
- CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行
- CyclicBarrier 回环栅栏,一般用于一组线程互相等待至某个状态,然后这一组线程再同时开始执行后续任务
- CountDownLatch 在使用完后不可重用
- CyclicBarrier 使用完后可重用
- Semaphore 信号量,一般用于控制对某组资源的访问权限。
2.CountDownLatch示例
void testCountDownLatch() { final CountDownLatch latch = ); new Thread() { public void run() { try { Log.d(TAG, "子线程" + Thread.currentThread().getName() + "正在执行"); Thread.sleep(); Log.d(TAG, "子线程" + Thread.currentThread().getName() + "执行完毕"); latch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } ; }.start(); new Thread() { public void run() { try { Log.d(TAG, "子线程" + Thread.currentThread().getName() + "正在执行"); Thread.sleep(); Log.d(TAG, "子线程" + Thread.currentThread().getName() + "执行完毕"); latch.countDown(); } catch (InterruptedException e) { e.printStackTrace(); } } ; }.start(); try { Log.d(TAG, "等待2个子线程执行完毕..."); latch.await(); Log.d(TAG, "2个子线程已经执行完毕"); Log.d(TAG, "继续执行主线程"); } catch (InterruptedException e) { e.printStackTrace(); } }
3.CyclicBarrier示例
static class Writer extends Thread { private CyclicBarrier cyclicBarrier; public Writer(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { Log.d(TAG, "线程" + Thread.currentThread().getName() + "正在写入数据..."); try { Thread.sleep(); //以睡眠来模拟写入数据操作 Log.d(TAG, "线程" + Thread.currentThread().getName() + "写入数据完毕,等待其他线程写入完毕"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } Log.d(TAG, "所有线程写入完毕,继续处理其他任务..."); } } //用来阻塞当前线程,直至所有线程都到达barrier状态再同时执行后续任务; void testCyclicBarrier1(){ ; CyclicBarrier barrier = new CyclicBarrier(N); ; i < N; i++) { new Writer(barrier).start(); } } //如果说想在所有线程写入操作完之后,进行额外的其他操作可以为CyclicBarrier提供Runnable参数 void testCyclicBarrier2(){ ; CyclicBarrier barrier = new CyclicBarrier(N, new Runnable() { @Override public void run() { Log.d(TAG, "当前线程" + Thread.currentThread().getName()); } }); ; i < N; i++){ new Writer(barrier).start(); } } //CyclicBarrier是可以重用的 void testCyclicBarrier3(){ ; CyclicBarrier barrier = new CyclicBarrier(N); ; i < N; i++) { new Writer(barrier).start(); } try { Thread.sleep(); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG, "CyclicBarrier重用"); ; i < N; i++) { new Writer(barrier).start(); } } //故意让最后一个线程启动延迟,因为在前面三个线程都达到barrier之后, //等待了指定的时间发现第四个线程还没有达到barrier,就抛出异常并继续执行后面的任务。 void testCyclicBarrier4(){ ; CyclicBarrier barrier = new CyclicBarrier(N); ; i < N; i++) { ) new Writer2(barrier).start(); else { try { Thread.sleep(); } catch (InterruptedException e) { e.printStackTrace(); } new Writer(barrier).start(); } } } static class Writer2 extends Thread{ private CyclicBarrier cyclicBarrier; public Writer2(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { Log.d(TAG, "线程"+Thread.currentThread().getName()+"正在写入数据..."); try { Thread.sleep(); //以睡眠来模拟写入数据操作 Log.d(TAG, "线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕"); try { cyclicBarrier., TimeUnit.MILLISECONDS);//等待了指定的时间(2ms)发现第四个线程还没有达到barrier,就抛出异常并继续执行后面的任务 } catch (TimeoutException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (InterruptedException e) { e.printStackTrace(); }catch(BrokenBarrierException e){ e.printStackTrace(); } Log.d(TAG, Thread.currentThread().getName()+"所有线程写入完毕,继续处理其他任务..."); } }
4.Semaphore示例
void testSemaphore() { ; //工人数 Semaphore semaphore = ); //机器数目 ; i < N; i++) new Worker(i, semaphore).start(); } static class Worker extends Thread { private int num; private Semaphore semaphore; public Worker(int num, Semaphore semaphore) { this.num = num; this.semaphore = semaphore; } @Override public void run() { try { semaphore.acquire(); Log.d(TAG,"工人" + this.num + "占用一个机器在生产..."); Thread.sleep(); Log.d(TAG,"工人" + this.num + "释放出机器"); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }
java中的线程(4):常用同步类 CountDownLatch、CyclicBarrier和Semaphore的更多相关文章
- Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger
在 java.util.concurrent 包中提供了 4 个有用的并发工具类 CountDownLatch 允许一个或多个线程等待其他线程完成操作,课题点 Thread 类的 join() 方法 ...
- Java中Collection、Map常用实现类研究分析
接口/实现类 描述 key是否可为null 为null是否报错 key是否重复 key重复是否报错 key是否和添加一致 是否线程安全 List 一组元素的集合 ArrayList 基于数组存储,读取 ...
- Java中创建线程的三种方式以及区别
在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
- 【Java中的线程】java.lang.Thread 类分析
进程和线程 联想一下现实生活中的例子--烧开水,烧开水时是不是不需要在旁边守着,交给热水机完成,烧开水这段时间可以去干一点其他的事情,例如将衣服丢到洗衣机中洗衣服.这样开水烧完,衣服洗的也差不多了.这 ...
- 关于Java中的线程安全(线程同步)
java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫 ...
- Java中的线程同步
Java 中的线程同步问题: 1. 线程同步: 对于访问同一份资源的多个线程之间, 来进行协调的这个东西. 2. 同步方法: 当某个对象调用了同步方法时, 该对象上的其它同步方法必须等待该同步方法执行 ...
- JAVA基础——Java 中必须了解的常用类
Java中必须了解的常用类 一.包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性的,比如基本类型不 ...
- Java中的线程Thread总结
首先来看一张图,下面这张图很清晰的说明了线程的状态与Thread中的各个方法之间的关系,很经典的! 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口. 要注意的是Threa ...
随机推荐
- [GO]二维数组的介绍
package main import "fmt" func main() { ][]int // 有几个方括号就是几维数据 // 有几个方括号就需要几重循环 k := ; i&l ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)
一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...
- Debian7安装后的配置(英文环境chromium浏览器中汉字变成方块的问题)
原文来自:http://www.programgo.com/article/3272573017/ 1.安装文泉宋体 sudo aptitude install xfonts-wqy sudo apt ...
- RegExp正则表达式对象
JavaScript的RegExp对象有两种创建方式,一种是字面量,一种是对象. var r = /pattern/attributes或者new RegExp(pattern, attributes ...
- 基于任务的异步编程模式(TAP)
异步编程是C#5.0的一个重要改进,提供两个关键字:async和await.使用异步编程,方法的调用是在后台运行(通常在线程或任务的帮助下),但不会阻塞调用线程.异步模式分为3种:异步模式.基于事件的 ...
- 采样器----Debug Sampler
Debug Sampler可以产生所有JMeter变量和属性的样本,可以在View Tree Result的响应中查看变量的值,此取样器在调试脚本阶段可以很方便的看到变量的值,在正式运行脚本的过程中应 ...
- 「BZOJ 2434」「NOI 2011」阿狸的打字机「AC自动机」
题意 有一个打字机,支持三种操作: 字符串末尾加一个小写字母 字符串末尾减一个字符 输出这个字符串 经过不超过\(n\)次操作后有\(m\)组询问:\((x,y)\),表示第\(x\)次输出第字符串在 ...
- stegsolve的功能
- lower_bound下确界
//lower_bound用于找到首个大于等于某个值的元素 #include<algorithm> #include<iostream> using namespace std ...
- javascript中var that=this
在JavaScript中,this代表的是当前对象. $(‘#conten').click(function(){ //this是被点击的#conten var that = this; $(‘.co ...