一、参考blog

https://www.cnblogs.com/dolphin0520/p/3920397.html

二、CountDownLatch

个人把它类比于一个持有计数的闸门,每到达这个闸门一个线程,计数减1,当计数为0时再执行闸门后续的动作。同时闸门失效了(只能用一次)。

public static void main(String[] args) {
Executor fix = Executors.newFixedThreadPool();
CountDownLatch latch = new CountDownLatch();
Runnable runner = () -> {
System.out.println("[" + Thread.currentThread().getName() + "]" + " started");
System.out.println("[" + Thread.currentThread().getName() + "]" + " finished");
latch.countDown();
};
fix.execute(runner);
fix.execute(runner);
try {
System.out.println("[" + Thread.currentThread().getName() + "]" + " waiting on latch...");
latch.await();
System.out.println("[" + Thread.currentThread().getName() + "]" + " ok, i can do my work");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

三、CyclicBarrier

用法差不多,特点:可以重复使用。

    public static void main(String[] args) {
Executor fix = Executors.newFixedThreadPool();
CyclicBarrier barrier = new CyclicBarrier();
Runnable runner = () -> {
try {
Thread.sleep(new Random().nextInt());
System.out.println("[" + Thread.currentThread().getName() + "]" + " wait on barri " + new Date());
barrier.await();
System.out.println("[" + Thread.currentThread().getName() + "]" + " condition ok, do my work " + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
};
fix.execute(runner);
fix.execute(runner);
}

四、Semaphore

向量,有点像锁。

import java.util.Date;
import java.util.Random;
import java.util.concurrent.*; public class Test {
//
public static void main(String[] args) {
Executor fix = Executors.newFixedThreadPool();
Semaphore semaphore = new Semaphore(); Runnable runner = () -> {
try {
semaphore.acquire();
System.out.println("[" + Thread.currentThread().getName() + "]" + " get a semaphore " + new Date());
Thread.sleep();
System.out.println("[" + Thread.currentThread().getName() + "]" + " release a semaphore " + new Date());
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}; for (int i = ; i < ; i++) {
fix.execute(runner);
} }

CountDownLatch、CyclicBarrier及Semaphore的用法示例的更多相关文章

  1. CountDownLatch CyclicBarrier和 Semaphore

    CountDownLatch CyclicBarrier和 Semaphore 原理 基于AQS实现. 让需要的暂时阻塞的线程,进入一个死循环里面,得到某个条件后再退出循环,以此实现阻塞当前线程的效果 ...

  2. CountDownLatch, CyclicBarrier and Semaphore

    Reference: [1] http://shazsterblog.blogspot.co.uk/2011/12/comparison-of-countdownlatch.html CountDow ...

  3. CountDownLatch、CyclicBarrier和Semaphore 使用示例及原理

    备注:博客园的markDown格式支持的特别不友好.也欢迎查看我的csdn的此篇文章链接:CountDownLatch.CyclicBarrier和Semaphore 使用示例及原理 CountDow ...

  4. 温故知新-多线程-forkjoin、CountDownLatch、CyclicBarrier、Semaphore用法

    Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 文章目录 摘要 forkjoin C ...

  5. Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future

    CountDownLatch.CyclicBarrier.Semaphore.Callable.Future  都位于java.util.concurrent包下,其中CountDownLatch.C ...

  6. Java并发之CountDownLatch、CyclicBarrier和Semaphore

    CountDownLatch 是能使一组线程等另一组线程都跑完了再继续跑:CyclicBarrier 能够使一组线程在一个时间点上达到同步,可以是一起开始执行全部任务或者一部分任务. CountDow ...

  7. Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)

    在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ...

  8. Java中的并发工具类:CountDownLatch、CyclicBarrier和Semaphore

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 一. ...

  9. CountDownLatch/CyclicBarrier/Semaphore 使用过吗?

    CountDownLatch/CyclicBarrier/Semaphore 使用过吗?下面详细介绍用法: 一,(等待多线程完成的)CountDownLatch  背景; countDownLatch ...

随机推荐

  1. hdu3261

    题意: 求至少出现k次的最长字符串(可重复) 题解: 后缀数组维护height数组只要找连续k个的最小值 代码: #include <cstdio> #include <algori ...

  2. Python接收执行参数

    1.python内置模块sys的sys.argv函数会将解释器执行时的所有参数保存为一个列表. a.首先创建文件login.py #!/usr/bin/env python #-*- coding:u ...

  3. 015 在Spark中关于groupByKey与reduceByKey的区别

    1.groupByKey的源代码 2.groupByKey的使用缺点 不使用groupByKey的主要原因:在大规模的数据下,数据分布不均匀的情况下,可能导致OOM 3.reduceByKey的源代码 ...

  4. 程序员之路:python3+PyQt5+pycharm桌面GUI开发(转)

    程序员之路:python3+PyQt5+pycharm桌面GUI开发 http://blog.sina.com.cn/s/blog_989218ad0102wz1k.html 先看效果: 图 1 没错 ...

  5. poj 1579 Function Run Fun 【记忆化递归】

    <题目链接> 题目大意: 给出一些递归式,直接套用这些递归式计算. 解题分析: 递归式已经由题目明确说明了,但是无脑递归铁定超时,所以此时,我们需要加上记忆化,对于那些已经算过的,就没有必 ...

  6. 【猿分享第10期】微信小程序Meetup扫盲专场回顾(转载)

    首先感谢答疑师:子慕 前端工程师,目前就职于医联,偶尔写点博客,吐槽总结,偶尔吟“湿”作对,润滑万物,江湖人称子慕大诗人. 直播间语音回放收听,请微信扫描下图二维码授权进入即可. 以下为本次直播的全部 ...

  7. SystemTap - 安装

    按照SystemTap Beginners Guide的Installation and Setup部分安装了SystemTap,没想到竟然还有点曲折,在这里纪录一下. 环境 Linux发行版本:Ce ...

  8. php 使用curl获取Location:重定向后url

    在php获取http头部信息上,php有个自带的函数get_headers(),我以前也是用这个的,听说效率在win上不咋地,再加上最近研究百度url无果,写了cURL获取重定向url的php代码来折 ...

  9. 潭州课堂25班:Ph201805201 第十四课 异常,处理 (课堂笔记)

    程序难免会出现错误 : 语法错误 : 逻辑错误: AttributeError  -->>  试图访问一个对象没有的属性, IOError  ---->>  输入输出异常 In ...

  10. 潭州课堂25班:Ph201805201 第十一课 继承,多继承和魔术方法,属性和方法 (课堂笔记)

    继承: class p : cls_name = 'p' def __init__(self): print('正在实例化') def __del__(self): print('正在销毁') cla ...