Java并发编程之并发工具类
CountDownLatch
CountDownLatch可以用于一个或多个线程等待其他线程完成操作.
示例代码
private static CountDownLatch c = new CountDownLatch(1);
public static void main(String[] args) {
System.out.println("main start");
try {
new Thread(new Runnable(){
@Override
public void run() {
try {
System.out.println("thread1 start");
Thread.sleep(3000);
System.out.println("thread1 end");
} catch (InterruptedException e) {
e.printStackTrace();
}
c.countDown();
}
}, "thread1").start();
c.await();
System.out.println("main end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
代码中, 主线程启动一个thread1线程后, 调用CountDownLatch的await()方法被阻塞, 一直等到计数器减为0.
CountDownLatch的构造方法接收一个参数n作为计数器, 可以想象为一个门有n个门闩, 每次调用countDown()方法, 计数器就减1, 即打开一个门闩. 当所有门闩都打开的时候, 调用await()方法的线程被唤醒.
await(long timeout, TimeUnit unit)方法表示等待一定时间后, 当前不会再阻塞当前线程.
CyclicBarrier
CyclicBarrier可以看作是可循环使用的屏障. 它的作用是, 让一组线程达到一个屏障时被阻塞, 直到最后一个线程到达屏障时, 屏障才会放行, 所有被阻塞的线程才可以继续运行.
示例代码
private static CyclicBarrier cb = new CyclicBarrier(3);
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
try {
System.out.println("thread1 start");
Thread.sleep(2000);
cb.await();
System.out.println("thread1 end");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
try {
System.out.println("thread2 start");
Thread.sleep(2000);
cb.await();
System.out.println("thread2 end");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
try {
cb.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("main");
}
代码中, CyclicBarrier的构造方法的参数表示屏障拦截的线程数, 每个线程通过await()通知CyclicBarrier已到达屏障, 然后此线程被阻塞.
另外, CyclicBarrier还有一另种构造方法CyclicBarrier(int parties, Runnable barrierAction), 表示在所有线程达到屏障时, 先执行barrierAction, 方便处理更复杂的业务场景.
await(long timeout, TimeUnit unit)方法表示等待一定时间后, 当前不会再阻塞当前线程.
与CountDownLatch的不同之处在于, CyclicBarrier可以通过reset()方法重置.
Semaphore
Semaphore(信号量)是用来控制同时访问资源的线程数.
Semaphore可以用于做流量控制, 特别是公共资源有限的场景.
示例代码
private static Semaphore sema = new Semaphore(5);
public static void main(String[] args) {
for(int i=0; i<30; i++) {
new Thread(new Runnable(){
@Override
public void run() {
try {
sema.acquire();
System.out.println(Thread.currentThread().getName());
Thread.sleep(3000);
sema.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
代码中, 创建了30个线程, 但是同时只有5个线程可以并发执行.
线程先调用acquire()方法获取许可, 运行完成后再调用release()方法释放许可.
另外, Semaphore还提供了tryAcquire()方法来试图获取许可, 获取成功则返回true.
Exchanger
Exchanger用于两个线程交换数据.
线程通过调用exchange()方法交换数据, 先调用exchange()方法的线程会一定阻塞, 等待第二个线程调用此方法; 当两个线都调用了exchange()方法时, 两个线程就可以实现交换数据了.
private static Exchanger<String> ex = new Exchanger<String>();
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
try {
String result = ex.exchange("I am thread1...");
System.out.println("thread1: " + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "thread1").start();
new Thread(new Runnable(){
@Override
public void run() {
try {
String result = ex.exchange("I am thread2...");
System.out.println("thread2: " + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "thread2").start();
}
Java并发编程之并发工具类的更多相关文章
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- Java并发编程:并发容器之ConcurrentHashMap(转载)
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- 线程高级应用-心得6-java5线程并发库中同步工具类(synchronizers),新知识大用途
1.新知识普及 2. Semaphore工具类的使用案例 package com.java5.thread.newSkill; import java.util.concurrent.Executor ...
- Java并发编程:并发容器之ConcurrentHashMap
转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...
- Java并发编程:并发容器之CopyOnWriteArrayList
转载: Java并发编程:并发容器之CopyOnWriteArrayList Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个 ...
- Java并发编程:并发容器ConcurrentHashMap
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- 【转】Java并发编程:并发容器之CopyOnWriteArrayList
Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...
- 【转】Java并发编程:并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...
- Java并发编程:并发容器之ConcurrentHashMap(转)
本文转自:http://www.cnblogs.com/dolphin0520/p/3932905.html Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载 ...
- 11、Java并发编程:并发容器之CopyOnWriteArrayList
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
随机推荐
- 织梦cms网上复制图片不可用的解决方法
背景描述: 织梦cms采集图片集时, 需要使用织梦cms提供的"网上复制图片"的功能, 好像我这里这个功能一直不可用, 今天下定决心研究了下源代码并进行了适当修改, 将我的修改提供 ...
- ThreadLocal源码分析:(一)set(T value)方法
在ThreadLocal的get(),set()的时候都会清除线程ThreadLocalMap里所有key为null的value. 而ThreadLocal的remove()方法会先将Entry中对k ...
- Python内置函数(19)——oct
英文文档: oct(x) Convert an integer number to an octal string. The result is a valid Python expression. ...
- wordpress怎么禁止文章复制
登陆你的网站后台--点击菜单栏的"外观"--点击"编辑"--在右侧,找到footer.php,打开它--在</body>之前加入以下代码: 1.禁止 ...
- 老帖收藏,留供参考:SpringMvc2.5+Mybatis3.2.7
一.项目背景 SpringMvc+Mybatis 数据库连接池是阿里巴巴的druid.日志框架式logback 二.配置文件 1.SpringMvc-servlet.xml <?xml vers ...
- guava-19.0和google-collections-1.0 的 ImmutableSet 类冲突
guava-19.0 google-collections-1.0 都有 ImmutableSet 类,包路径也一致,前者有 copyOf(Collection)? 一.应用报错: 二.解决办法 co ...
- spring-oauth-server实践:使用授权方式四:client_credentials 模式的客户端和服务端交互
spring-oauth-server入门(1-11)使用授权方式四:client_credentials 模式的客戶端 一.客户端逻辑 1.界面入口(credentials_access_token ...
- (java基础)Java输入输出流及文件相关
字节流: 所有的字节输入输出都继承自InputStream和OutputStream,通常用于读取二进制数据,最基本单位为单个字节,如图像和声音.默认不使用缓冲区. FileInputStream和F ...
- MySql查询正在进行中的事务
用法 SELECT * FROM information_schema.INNODB_TRX 这个只能查询此刻正在进行中的事务,已经完成的是查不到的 表字段定义 The INFORMATION_SCH ...
- 复习上学期的HTML+CSS(1)
自己跟着网上教程复习上学期的HTML+CSS,因为已经忘得差不多了,而且现在学的js也要以HTML+CSS为基础,坚持每天持续更新. n B/S 网络结构 Browser/Server 浏览器/ ...