CountDownLatch、CyclicBarrier和Semaphore使用
- CountDownLatch
CountDownLatch是用来线程计数的。等待一组线程全部执行完后再本线程继续执行。如:A线程需要等待B、C和D(由初始化CountDownLatch参数觉得等待多少个线程)线程执行完后再执行。
主要的方法:
// 构造方法,count决定等待多少个线程
public CountDownLatch(int count)
// 等待线程完成数减1
public void countDown()
// 调用await本线程会挂起,当等待线程未完成数为0,即countDown调用次数等于构造方法参数值时会被唤醒
public void await()
public boolean await(long timeout, TimeUnit unit)
以下是CountDownLatch的用法:
public class CountDownLatchTest {
public static void main(String[] args) {
final CountDownLatch countDownLatch = new CountDownLatch(2);
for (int i = 0; i < 2; i++) {
new Thread(() -> {
try {
String name = Thread.currentThread().getName();
System.out.println("子线程" + name + "正在运行中......");
TimeUnit.SECONDS.sleep(5);
System.out.println("子线程" + name + "执行完毕");
countDownLatch.countDown();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
try {
System.out.println("======等待两个子线程执行完毕");
// 只有子线程执行完毕个数等于CountDownLatch初始化个数才会继续执行await后面代码
countDownLatch.await();
System.out.println("两个子线程都执行完毕!!!!!!");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程继续执行中。。。。。。。。");
}
}
结果:
子线程Thread-0正在运行中......
======等待两个子线程执行完毕
子线程Thread-1正在运行中......
子线程Thread-1执行完毕
子线程Thread-0执行完毕
两个子线程都执行完毕!!!!!!
主线程继续执行中。。。。。。。。
- CyclicBarrier
CyclicBarrier 设置一个障碍点,让同组线程到达改点的线程等待本组未达到该点的线程,同组全部线程到达该点才越过障碍物释放资源,让其它组循环利用该对象。
主要方法:
// 构造方法设置同组线程数
public CyclicBarrier(int parties)
// 构造方法设置同组线程数;全部达到障碍物时执行barrierAction函数
public CyclicBarrier(int parties, Runnable barrierAction)
// 某个线程调用await时挂起,需要等同组所有线程到达才能唤醒
public int await() throws InterruptedException, BrokenBarrierException
以下是 CyclicBarrier 的用法:
/**
* Created on 18/3/15 14:40.
*
* @author wolf
*/
public class CyclicBarrierTest {
public static void main(String[] args) {
int n = 3;
CyclicBarrier barrier = new CyclicBarrier(n);
for (int i = 0; i < 3; i++) {
new Worker(barrier).start();
}
try {
TimeUnit.SECONDS.sleep(6);
System.out.println("--------讨厌的循环利用分割线------------");
} catch (Exception e) {
e.printStackTrace();
}
for (int i = 0; i < n; i++) {
new Worker(barrier).start();
}
}
static class Worker extends Thread {
private CyclicBarrier barrier;
public Worker(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
long startTime = System.currentTimeMillis();
String name = Thread.currentThread().getName();
System.out.println("线程 " + name + " 正在执行任务.......");
try {
int time = RandomUtils.nextInt(1, 5);
TimeUnit.SECONDS.sleep(time);
System.out.println("线程 " + name + " 执行任务完毕!!!用时:" + time);
barrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程 " + name + " 全部耗时:"+(System.currentTimeMillis()-startTime));
}
}
}
- Semaphore
Semaphore 通过名字我们就知道这个计算信号量,也就是控制获取资源的许可证。
主要的方法:
// 构造方法设置可用资源的数量,即许可证的数量
public Semaphore(int permits)
// 构造方法设置可用资源的数量,即许可证的数量,fair 是否公平获得许可证,默认是先来后到公平的
public Semaphore(int permits, boolean fair)
// 同步获取许可证,
public void acquire() throws InterruptedException
// 尝试获取许可证,结果直接返回
public boolean tryAcquire()
// 尝试获取许可证,结果等待时间超时直接返回
public boolean tryAcquire(long timeout, TimeUnit unit)
// 释放许可证,可给其它等待线程使用
public void release()
以下是 Semaphore 用法:
public class SemaphoreTest {
public static void main(String[] args) {
int no = 5;
Semaphore semaphore = new Semaphore(2);
for (int i = 0; i < no; i++) {
new Worker(i, semaphore).start();
}
}
static class Worker extends Thread {
private int no;
private Semaphore semaphore;
public Worker(int no, Semaphore semaphore) {
this.no = no;
this.semaphore = semaphore;
}
@Override
public void run() {
try {
long startTime = System.currentTimeMillis();
semaphore.acquire();
System.out.println("worker " + this.no + " 获取许可证,开始工作....");
int time = RandomUtils.nextInt(1, 5);
TimeUnit.SECONDS.sleep(time);
semaphore.release();
System.out.println("worker " + this.no + " 完成工作,释放许可证!耗时:" + (System.currentTimeMillis() - startTime));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
CountDownLatch、CyclicBarrier和Semaphore使用的更多相关文章
- CountDownLatch CyclicBarrier和 Semaphore
CountDownLatch CyclicBarrier和 Semaphore 原理 基于AQS实现. 让需要的暂时阻塞的线程,进入一个死循环里面,得到某个条件后再退出循环,以此实现阻塞当前线程的效果 ...
- CountDownLatch, CyclicBarrier and Semaphore
Reference: [1] http://shazsterblog.blogspot.co.uk/2011/12/comparison-of-countdownlatch.html CountDow ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...
- Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future
CountDownLatch.CyclicBarrier.Semaphore.Callable.Future 都位于java.util.concurrent包下,其中CountDownLatch.C ...
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...
- CountDownLatch、CyclicBarrier和Semaphore
转载:http://www.cnblogs.com/dolphin0520/p/3920397.html 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDown ...
- 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...
- Java并发之CountDownLatch、CyclicBarrier和Semaphore
CountDownLatch 是能使一组线程等另一组线程都跑完了再继续跑:CyclicBarrier 能够使一组线程在一个时间点上达到同步,可以是一起开始执行全部任务或者一部分任务. CountDow ...
- CountDownLatch、CyclicBarrier、Semaphore共同之处与区别以及各自使用场景
区别 CountDownLatch 使一个线程A或是组线程A等待其它线程执行完毕后,一个线程A或是组线程A才继续执行.CyclicBarrier:一组线程使用await()指定barrier,所有线程 ...
随机推荐
- Spring 集成Kafka(完整版)
前面的文章我们已经完成了Kafka基于Zookeeper的集群的搭建了.Kafka集群搭建请点我.记过几天的研究已经实现Spring的集成了.本文重点 jar包准备 集成是基于spring-integ ...
- Spring项目集成ShiroFilter简单实现权限管理
Shiros是我们开发中常用的用来实现权限控制的一种工具包,它主要有认证.授权.加密.会话管理.与Web集成.缓存等功能.我是从事javaweb工作的,我就经常遇到需要实现权限控制的项目,之前我们都是 ...
- python第二课--分支结构与循环结构
if语句---分支结构 在Python中,要构造分支结构可以使用if.elif和else关键字.所谓关键字就是有特殊含义的单词,像if和else就是专门用于构造分支结构的关键字,很显然你不能够使用它作 ...
- java读取本机磁盘及遍历磁盘文件
1. 获取本机所有盘符信息 //1. 获取本机盘符 File[] roots = File.listRoots(); for (int i = 0; i < roots.length; i++) ...
- python小白手册之远程链接转换
访问顺序补充
- Maven Wrapper(mvnw)
Maven Wrapper Maven Wrapper是一个Maven插件,用于封装提供Maven项目构建时所需要的一切.这么说可能比较抽象,来举个具体的例子吧. 一个Maven项目由多人协作维护,某 ...
- 单元测试之NUnit三
NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 除了Assert断言外 ...
- java 获取真实ip和根据ip获取ip所在地区
import com.alibaba.fastjson.JSON; import javax.servlet.http.HttpServletRequest; import java.io.ByteA ...
- MySQL之主从同步
一.主从同步概念 1.1 什么是主从同步? MySQL 主从同步是指将数据从一个 MySQL 数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器 ...
- MySQL之Xtrabackup的使用
一.Xtrabackup介绍 XtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle).Pe ...