下面对上面说的三个辅助类进行一个总结:

  1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:

    CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;

    而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;

    另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。

  2)Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限或者限流等等。

下面是几个小例子

public class CountDownLatchDemo {public static void main(String[] args) {final CountDownLatch latch = new CountDownLatch(2);System.out.println("等爸爸妈妈都来了就吃饭");new Thread(new Runnable() {@Overridepublic void run() {try {System.out.println("爸爸过来了");Thread.sleep(3000);latch.countDown();} catch (InterruptedException e) {e.printStackTrace();}}}).start();new Thread(new Runnable() {@Overridepublic void run() {try {System.out.println("妈妈过来了");Thread.sleep(3000);latch.countDown();} catch (InterruptedException e) {e.printStackTrace();}}}).start();try {latch.await();System.out.println("开饭了");} catch (InterruptedException e) {e.printStackTrace();}}
}

public class CyclicbarrierDemo {public static void main(String[] args) {int no = 3;final CyclicBarrier cyclicBarrier = new CyclicBarrier(no, new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"发令员:3---2---1,跑!");}});for (int i = 0; i < no; i++) {new Thread(new Sportsman(cyclicBarrier)).start();}}static class Sportsman implements Runnable{CyclicBarrier cyclicBarrier;public Sportsman(CyclicBarrier cyclicBarrier) {this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {try {Thread.sleep((int)(Math.random()*1000));System.out.println(Thread.currentThread().getName()+"准备好了,等待发令枪");cyclicBarrier.await();} catch (Exception e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"突突突");}}
}

public class SemaphoreDemo {public static void main(String[] args) {final Semaphore semaphore = new Semaphore(3);new Thread(new Runnable() {@Overridepublic void run() {try {semaphore.acquire(3);System.out.println(Thread.currentThread().getName()+"获取3个许可证");Thread.sleep(2000L);}catch (Exception e){e.printStackTrace();}finally {semaphore.release(3);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {boolean flag = false;try {flag = semaphore.tryAcquire(1, 1, TimeUnit.SECONDS);if(flag){System.out.println(Thread.currentThread().getName()+"获取一个许可证");}else {System.out.println(Thread.currentThread().getName()+"获取失败!不能进入");}}catch (Exception e){e.printStackTrace();}finally {if(flag){//可以释放其他线程的信号量,如果没有获取到,不要释放,不然会有问题
                        semaphore.release();}}}}).start();}
}

转载于:https://www.cnblogs.com/foreverYoungCoder/p/10517417.html

一、基础篇--1.3进程和线程-CountDownLatch、CyclicBarrier 和 Semaphore相关推荐

  1. 一起学JAVA之【基础篇】4种默认线程池介绍

    一起学JAVA之[基础篇]4种默认线程池介绍 默认线程池创建方式 java.util.concurrent 提供了一个创建线程池的工具类Executors,里面有四种常用的线程池创建方法 public ...

  2. linux基础篇-系统中进程相关概念

    进程概念  内核的功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能等  Process: 运行中的程序的一个副本,是被载入内存的一个指令集合进程ID(Process ID,PID) ...

  3. 计算机基础:程序、进程、线程

    进程.线程.多线程相关总结 一.说说概念 1.进程(process) 狭义定义:进程就是一段程序的执行过程. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态 ...

  4. 并发基础篇(六):线程Thread类的start()方法和run()方法

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本 ...

  5. java多线程基础篇(二)java线程常见问题Thread Dump日志分析

    线程常见问题 CPU占用率很高,响应很慢 CPU占用率不高,但响应很慢 线程出现死锁的情况 CPU占用率不高,但响应很慢 有的时候我们会发现CPU占用率不高,系统日志也看不出问题,那么这种情况下,我们 ...

  6. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括: 1. interrupt()说明 2. 终止线程的方式   2.1 终止处于"阻塞状态"的线 ...

  7. Java基础篇--多线程之第一个线程用来计算2~100000之间的素数的个数,第二个线程用来计算100000~200000之间的素数的个数

    多线程操作: 编写一个有两个线程的程序,第一个线程用来计算2-100000之间的素数的个数,第二个线程用来计算100000-200000之间的素数的个数,最后输出结果. 1.判断是否为素数的方法: 是 ...

  8. interupt java_Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 1. interrupt()说明 在介绍终止线程的方式之前,有必要先对interrupt()进行了解. Interrupts this thread. Unless the current th ...

  9. 《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)

  10. 进程和线程基础知识(已经是最详细的啦)

    进程和线程基础知识 文章目录 进程和线程基础知识 一.前言 二.进程 1.引入 2.并发和并行有什么区别? 3.进程与程序的关系的类比 4.进程的状态 5.进程的控制结构 6.进程的控制 7.进程的上 ...

最新文章

  1. redis setnx 分布式锁_手写Redis分布式锁
  2. bash shell while语法
  3. docker二进制代码编译
  4. HDU - 5876 Sparse Graph(bfs+set)
  5. Unity3D笔记十 游戏元素
  6. 【dfs】【拓扑排序】组合树
  7. 快递员遭投诉吞安眠药护自尊 顺丰王卫:马上检讨 立即整改
  8. 【nginx】nginx 高可用集群
  9. php 数据分流,php实现请求分流 - osc_6fvwlc7h的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. html顶栏符号不显示,html – 带有USE标记的SVG无法呈现
  11. Keil(MDK) 5 软件安装教程
  12. BUG记录 —— JSON转对象部分字段丢失
  13. 《模式识别》期末考试考题汇总带答案
  14. linux下无线USB网卡驱动安装
  15. java读取ppm图片_C++ 输出PPM格式图片文件
  16. IDEA部署项目到tomcat运行成功但是页面404的两种原因
  17. 如何将视频中的音频提取出来
  18. 【论文笔记】面向机载应用的多传感器图像融合技术综述
  19. 基于 SpringBoot 的人事管理系统的设计与实现
  20. 【FreeRTOS】06 临界段的保护——关中断和关调度

热门文章

  1. 线程+urllib下载互联网图片的一个示例
  2. python 加速方法_加速Python的几种方法
  3. 力扣题目系列:121. 买卖股票的最佳时机
  4. php 无符号位移怎么使用,,(有符号位移)和(无符号位移)的使用方法,及差别...
  5. Node.js因为OpenSSL安全问题推迟更新
  6. 使用Chef管理windows集群
  7. 理解insert all/insert first的使用
  8. 关于EXCEL操作的问题
  9. PhotoShop插件的开发
  10. vue.js 父子组件间 props 数据同步处理