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. Python设计TFTP客户端

    #coding=utf-8 from socket import * from threading import Thread import struct def recvData(fileName, ...

  2. MySql入门(2-2)创建数据库

    mysql -u root -p; show databases; create database apigateway; use apigateway; show tables;

  3. android- 远程调试

    最近由于要在另外一台android设备上调试代码,在本机PC上查看其log.两台机器离的比较远, 无法用usb直接连接,于是在网上找了很多资料,最找使用adb connect方法解决了该问题.解决过程 ...

  4. 【52ABP实战教程】00-- ASP.NET CORE系列介绍

    为什么是.net core? 记得在半年前.NET CORE刚刚出了1.0,当时有朋友推荐我使用的时候,个人觉得还不成熟. 现在.NET Core已经到了2.0,.NET Standard 2.0 添 ...

  5. windows计划任务

    前段时间写了一个小工具,实现两个数据库的数据同步. 需求:要求每天的某个时间自动同步数据 功能写好之后,发现了windows一个自带的功能不错,可以实现我的需要,不用写定时器触发了 控制面板-> ...

  6. C# 客户端程序调用外部程序的三种实现

    简介 我们用C#来开发客户端程序的时候,总会不可避免的需要调用外部程序或者访问网站,本篇博客介绍了三种调用外部应用的方法,供参考 实现 第一种是利用shell32.dll,实现ShellExecute ...

  7. JavaScript实现接口的三种经典方式

    /* 接口:提供一种说明一个对象应该有哪些方法的手段 js中有三种方式实现接口: 1 注释描述接口 2 属性检测接口 3 鸭式辨型接口 */ /* 1 注释描述接口: 不推荐 优点: 利用注解,给出参 ...

  8. power designer 连接mysql提示“connection test failed”

    本机环境: win10 64位 jdk8 64位 问题: 测试连接时,总是提示 根据网上搜索: 根源在于:PowerDesigner based on 32 bit JVM kernel 参考: ht ...

  9. 南京邮电大学java第一次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...

  10. 教你用命令行激活win10系统

    对于笔者这样爱自己动手的电脑爱好者来说,当然会选择自己组装一台性价比高的台式电脑,一切都准备就绪了,系统也装好了,就差最后一步了--激活系统. 笔者真的很幸运,在网上找到了一些可以使用的密钥,我装的是 ...