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并发编程之并发工具类的更多相关文章

  1. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  2. Java并发编程:并发容器之ConcurrentHashMap(转载)

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

  3. 线程高级应用-心得6-java5线程并发库中同步工具类(synchronizers),新知识大用途

    1.新知识普及 2. Semaphore工具类的使用案例 package com.java5.thread.newSkill; import java.util.concurrent.Executor ...

  4. Java并发编程:并发容器之ConcurrentHashMap

    转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...

  5. Java并发编程:并发容器之CopyOnWriteArrayList

    转载: Java并发编程:并发容器之CopyOnWriteArrayList Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个 ...

  6. Java并发编程:并发容器ConcurrentHashMap

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

  7. 【转】Java并发编程:并发容器之CopyOnWriteArrayList

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...

  8. 【转】Java并发编程:并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...

  9. Java并发编程:并发容器之ConcurrentHashMap(转)

    本文转自:http://www.cnblogs.com/dolphin0520/p/3932905.html Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载 ...

  10. 11、Java并发编程:并发容器之CopyOnWriteArrayList

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

随机推荐

  1. 织梦cms网上复制图片不可用的解决方法

    背景描述: 织梦cms采集图片集时, 需要使用织梦cms提供的"网上复制图片"的功能, 好像我这里这个功能一直不可用, 今天下定决心研究了下源代码并进行了适当修改, 将我的修改提供 ...

  2. ThreadLocal源码分析:(一)set(T value)方法

    在ThreadLocal的get(),set()的时候都会清除线程ThreadLocalMap里所有key为null的value. 而ThreadLocal的remove()方法会先将Entry中对k ...

  3. Python内置函数(19)——oct

    英文文档: oct(x) Convert an integer number to an octal string. The result is a valid Python expression. ...

  4. wordpress怎么禁止文章复制

    登陆你的网站后台--点击菜单栏的"外观"--点击"编辑"--在右侧,找到footer.php,打开它--在</body>之前加入以下代码: 1.禁止 ...

  5. 老帖收藏,留供参考:SpringMvc2.5+Mybatis3.2.7

    一.项目背景 SpringMvc+Mybatis 数据库连接池是阿里巴巴的druid.日志框架式logback 二.配置文件 1.SpringMvc-servlet.xml <?xml vers ...

  6. guava-19.0和google-collections-1.0 的 ImmutableSet 类冲突

    guava-19.0 google-collections-1.0 都有 ImmutableSet 类,包路径也一致,前者有 copyOf(Collection)? 一.应用报错: 二.解决办法 co ...

  7. spring-oauth-server实践:使用授权方式四:client_credentials 模式的客户端和服务端交互

    spring-oauth-server入门(1-11)使用授权方式四:client_credentials 模式的客戶端 一.客户端逻辑 1.界面入口(credentials_access_token ...

  8. (java基础)Java输入输出流及文件相关

    字节流: 所有的字节输入输出都继承自InputStream和OutputStream,通常用于读取二进制数据,最基本单位为单个字节,如图像和声音.默认不使用缓冲区. FileInputStream和F ...

  9. MySql查询正在进行中的事务

    用法 SELECT * FROM information_schema.INNODB_TRX 这个只能查询此刻正在进行中的事务,已经完成的是查不到的 表字段定义 The INFORMATION_SCH ...

  10. 复习上学期的HTML+CSS(1)

    自己跟着网上教程复习上学期的HTML+CSS,因为已经忘得差不多了,而且现在学的js也要以HTML+CSS为基础,坚持每天持续更新. n  B/S 网络结构   Browser/Server 浏览器/ ...