juc.CountDownLatch 闭锁

一个线程在等待一组线程后再恢复执行

await()等待其他线程执行完毕

被等待线程执行完毕后计数器-1

如何知道其他线程执行完了?

计数器,若一组线程为,CountDown为5,减到0代表等待线程被全部执行完毕

一次性工具:当Countdown的值减到0的时候再也无法恢复

juc内部的代码都是lock体系来实现的

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;// 运动员线程
class CDLTask implements Runnable {private CountDownLatch countDownLatch;public CDLTask(CountDownLatch countDownLatch) {this.countDownLatch = countDownLatch;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"开始跑步");try {TimeUnit.SECONDS.sleep(1);System.out.println(Thread.currentThread().getName()+"到达终点");countDownLatch.countDown();} catch (InterruptedException e) {e.printStackTrace();}}
}public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(4);CDLTask cdlTask = new CDLTask(countDownLatch);System.out.println("比赛开始...");new Thread(cdlTask,"运动员A").start();new Thread(cdlTask,"运动员B").start();new Thread(cdlTask,"运动员C").start();new Thread(cdlTask,"运动员D").start();// 等待所有线程都到达终点后再输出此语句
        countDownLatch.await();System.out.println("比赛结束...");}
}


juc.CyclicBarrier  循环栅栏

一组线程同时到达临界点后再恢复执行(先到达临界点的线程会阻塞,直到所有线程都到达临界点)

public CyclicBarrier(int parties, Runnable barrierAction)

当多个线程同时到达临界点时,

随机挑选一个线程执行barrierAction后再同时恢复执行

计数器的值可以恢复

await

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;class CBTask implements Runnable {private CyclicBarrier cyclicBarrier;public CBTask(CyclicBarrier cyclicBarrier) {this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"正在写入数据...");try {TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕...");cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println("所有线程均已写入完毕,继续恢复执行...");}
}
class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(4,() -> {System.out.println("当前线程为:"+Thread.currentThread().getName());});CBTask cbTask = new CBTask(cyclicBarrier);for (int i = 0; i < 4; i++) {new Thread(cbTask,"写线程"+(i+1)).start();}}
}


juc.Exchanger 线程交换器

用于两个线程直线的数据交换,当Exchanger只有一个线程时,该线程会阻塞直到有别的线程调用exchange进入缓冲区,当前线程与新线程交换数据后同时恢复执行。
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;class ExchangerDemo {public static void main(String[] args) {Exchanger<String> exchanger = new Exchanger<>();Thread girlThread = new Thread(() -> {try {String girl = exchanger.exchange("我喜欢你.....");System.out.println("女生说:"+girl);} catch (InterruptedException e) {e.printStackTrace();}});girlThread.start();Thread boyThread = new Thread(() -> {System.out.println("女神缓缓步入眼帘...");try {TimeUnit.SECONDS.sleep(1);String boy = exchanger.exchange("我喜欢你!");System.out.println("男生说:"+boy);} catch (InterruptedException e) {e.printStackTrace();}});boyThread.start();}
}


juc.Semaphore 信号量

acquire() : 尝试占用一个信号量,失败的线程会阻塞直到有新的信号量

release() : 释放一个信号量

acquire(int n) : 尝试占用n个信号量,失败的线程会阻塞直到有新的信号量

release(int n) : 释放n个信号量
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;class SemaphoreTask implements Runnable {private Semaphore semaphore;public SemaphoreTask(Semaphore semaphore) {this.semaphore = semaphore;}@Overridepublic void run() {try {semaphore.acquire(2);System.out.println(Thread.currentThread().getName()+"占用2台设备生产");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"生产完毕,释放设备");semaphore.release(2);} catch (InterruptedException e) {e.printStackTrace();}}
}
class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore = new Semaphore(5);SemaphoreTask task = new SemaphoreTask(semaphore);for (int i = 0; i < 8; i++) {new Thread(task,"工人"+(i+1)).start();}}
}

转载于:https://www.cnblogs.com/hetaoyuan/p/11317029.html

juc包下四大并发工具相关推荐

  1. 多线程十 JUC包下的常用工具类

    JUC包下的常用工具类 1. CountDownLatch-闭锁 2. CyclicBarrier-循环栅栏 3. Semaphore-信号量 4. Exchanger-线程数据交换器 这篇文章主要是 ...

  2. 6.juc包下的原子类AtomicInteger,AtomicLong等AtomicXXX介绍

     在介绍juc中的原子类之前,先看看官方文档对java.util.concurrent.atomic包的介绍官方文档地址这里截取翻译之后的部分描述 1. 支持对单个变量进行无锁线程安全编程 2. 类的 ...

  3. JUC 常用 4 大并发工具类

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是JUC? JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些东西 该包的位置位 ...

  4. 多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等

    CAS CAS 是一种乐观锁,syncronized 是一种悲观锁 AtomicInteger AtomicInteger count = new AtomicInteger(0); /*synchr ...

  5. 111 多线程JUC包下代码分析

    2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列目录(共43篇) AtomicLongFieldUpdater:通过反射+CAS实现对传入对象的指定long ...

  6. JAVA中J.U.C 包下并发类的应用

    文章目录 JUC包中的锁应用 Lock接口及ReentrantLock对象分析及应用? Condition接口对象分析与应用? ReadWriteLock接口及实现类分析与应用? StampedLoc ...

  7. 常用并发工具类(锁和线程间通信工具类)

    常用并发工具类总结 JUC 下的常用并发工具类(锁和线程间通信工具类),主要包括 ReentrantLock.ReentrantReadWriteLock.CountDownLatch.CyclicB ...

  8. Java并发工具类:CountDownLatch、Semaphore、CyclicBarrier、Exchanger、Phaser

    本文目录: 1.CountDownLatch(闭锁) 1.CountDownLatch 例子 2.CyclicBarrier(循环栅栏) 1.CyclicBarrier 例子 2.CountDownL ...

  9. Java并发工具CountDownLatch使用详解

    本文目录 1.使用场景 2.使用介绍 3.使用案例 4. Thread.join()和CountDownLatch的区别 1.使用场景 通过使用 CountDownLatch可以使当前线程阻塞,等待其 ...

  10. 死磕Java并发:J.U.C之并发工具类:CountDownLatch

    作者:chenssy 来源:Java技术驿站 在上篇博客中介绍了Java四大并发工具一直的CyclicBarrier,今天要介绍的CountDownLatch与CyclicBarrier有点儿相似. ...

最新文章

  1. 稚晖君自制机械臂,能给葡萄缝针的那种,成本1万块,网友:能把脑子开源一下?...
  2. arm linux远程桌面win7卡顿,主编解答win7系统使用远程桌面出现卡顿的恢复方法
  3. linux下ip协议(V4)的实现(三)
  4. 将字符串转为16进制数_Python 如何将字符串转为字典
  5. 语义分割——Spatial Pyramid Pooling (SPP)的作用
  6. 第二章 jQuery选择器
  7. 【深度学习】论文导读:GoogLeNet模型,Inception结构网络简化(Going deeper with convolutions)
  8. 苹果手机如何投屏到电脑【无线有线】
  9. 大数据的应用:九大领域
  10. sessionStorage 、localStorage 和 cookie
  11. 软件质量模型介绍ISO/IEC 9126和ISO/IEC 25010
  12. 2021全球程序员收入报告,字节跳动年薪274万元排第5!
  13. 《每日一题》——146. LRU 缓存|460. LFU 缓存
  14. 24点游戏---java编写
  15. java丐帮_JAVA集合 list set map
  16. win10如何手动强制关联默认文件打开方式应用
  17. 渗透测试工程师都需要什么工具呢?网络安全(三)
  18. android实时刷新
  19. DeFi基准利率今日为3.38%
  20. 酒店直播服务器系统,用ffmpeg+nginx服务器实现类似酒店视频直播系统

热门文章

  1. nodejs的简单爬虫
  2. 后端类型/状态/标识校验限定法
  3. SpringBoot 添加junit单元测试+Spring Boot 的测试类库
  4. 使PNG图片在IE6下透明(非背景图片)
  5. MySQL 优化技巧
  6. SpringCloud实战(四)Sentinel自定义降级异常实战
  7. presentation编程软件_编程难学?web相关知识,跟着淼哥学php全栈之路6
  8. koa2 引擎模版html,Koa2模板引擎Ejs使用教程
  9. el表达式判断不为空_Java学习72天---EL和JSTL表达式学完.
  10. python接口测试覆盖率统计_pytest文档57-计算单元测试代码覆盖率(pytest-cov)