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,所有线程 ...
随机推荐
- Java——字符串
1.不可变的String String对象是不可变的.String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改修改后的字符串内容. public ...
- Javascript中的基本数据类型,如何判断数据类型,作用域链的理解
第一部分:Javascript中的数据类型 javascript中 基本数据类型有 五种, 数字 number 字符串 string 布尔 boolean 未定义 undefined 空值 nul ...
- 记录 Java 的 BlockingQueue 中的一些坑
最近学习了 BlockingQueue,发现 java 的 BlockingQueue 并不是每一个实现都按照 BlockingQueue 的语意来的,其中有不少坑. 直接上代码吧: 1.关于Prio ...
- TinyMCE使用
1.文本&文本字体颜色 与word类似不赘述 2.字体加粗&划线 与word类似不赘述 选中后 ctrl + B 加粗快捷键 选中后 ctrl + I 斜体快捷键 选中后 c ...
- python相关,各种命令集合
PS: cmd必须管理员身份运行 python版本 2.7 可能会出现编码问题:在 Lib/site-packages 新建文件 sitecustomize.py import sys sys.s ...
- c语言的输出
Cpp是c plus plus Cpp c++的源文件 c++支持c语言的语法 %x是十六进制x后面输出小写%X输出的结果是大写. %o是八进制. %lf是双精度double,默认小数点后六位,输出最 ...
- Python程序包的构建和发布过程
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- Springboot + Stopping service [Tomcat]+ Process finished with exit code 0
在Springboot 的版本为: <version>1.5.10.RELEASE</version> 原因:代码中有非法格式的结构,及代码写错啦,例如: <result ...
- Liunx软件安装之Tomcat
一.Tomcat 安装 1.1 yum 安装 1) 安装 tomcat 基础服务 sudo yum -y install tomcat 2) 安装管理界面 sudo yum -y install to ...
- VScode 插件推荐与C/C++配置
以下是我经常用到的VScode插件.由于插件本身具有详细的配置和介绍,不对插件本身的安装配置进行说明,仅仅支出这些插件的主要功能.具体使用强烈推荐看一下安装插件后的说明,大多数的问题和设置都可以找到, ...