一、参考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. asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1

    2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...

  2. asp.net core2.0大白话带你入门

    本系列包括: 1.新建asp.net core项目2.web项目目录解读3.配置访问地址4.环境变量详解5.配置文件6.日志7.DI容器8.服务的生命周期9.session的使用10.cookie的使 ...

  3. 024 SpringMvc的异常处理

    一:说明 1.介绍 Springmvc提供HandlerExceptionResolver处理异常,包括Handler映射,数据绑定,以及目标方法执行. 2.几个接口的实现类 AnnotationMe ...

  4. Redis特性--多数据库与事务性

    一:多数据库 1.默认 默认是数据库0 2.移动 二:事务 1.介绍 使用命令有三个:multi,exec,discard 2.再开启一个客户端方便进行验证 3.没有开启事务的情况 1端口设置: 在2 ...

  5. 洛谷 P1433 吃奶酪【DFS】+剪枝

    题目链接:https://www.luogu.org/problemnew/show/P1433 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处 ...

  6. SSL/TLS中间人攻击

    准备:kali.xp kali ip:192.168.14.157 目标ip:192.168.14.158 目标网关:192.168.14.2 使用工具:ettercap.sslstrip.arpsp ...

  7. 李宏毅机器学习笔记1:Regression、Error

    李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...

  8. 不会python?那就换一种姿势爬虫!Java爬虫技术总结

    -本博客为原创内容,转载需注明本人- 前几天有个师妹将要毕业,需要准备毕业论文,但是论文调研需要数据资料,上知网一查,十几万条数据!指导老师让她手动copy收集,十几万的数据手动copy要浪费多少时间 ...

  9. Python3 图片水平镜像实现

    # -*- coding: utf-8 -*- """ Created on Sun Feb 4 12:15:38 2018 @author: markli " ...

  10. PHP给图片加水印

    <?php /** *图片加水印 *@param $srcImg 原图 *@param $waterImg 水印图片 *@param $savepath 保存路径 *@param $savena ...