55 JUC并发编程2
2021/4/25 22:25:11
本文主要是介绍55 JUC并发编程2,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
JUC并发编程2
8、常用的辅助类
8.1、CountDownLatch
允许一个或多个线程等待直到其他线程中执行的一组操作完成同步辅助
计数器
public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { //总数是6,必须要执行任务的时候,再执行! CountDownLatch countDownLatch = new CountDownLatch(6); for (int i = 0; i <= 6 ; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"get out"); countDownLatch.countDown();// 计数器-1 },String.valueOf(i)).start(); } countDownLatch.await();//等待计数器归零,然后再向下执行,需要抛出异常 System.out.println("close door"); } }
原理:
countDownLatch.countDown();// 计数器-1
countDownLatch.await();//等待计数器归零,然后再向下执行
每次有线程调用countDownLatch.countDown();// 计数器-1
,调用这个方法不会阻塞,假设计数器变为0,countDownLatch.await();
就会被唤醒,继续执行
8.2、CyclicBarrier
允许一组线程全部等待彼此达到共同屏障点,同步辅助
加法计数器
public class CyclicBarrierDemo { public static void main(String[] args) { //集齐7颗龙珠召唤神龙 //召唤龙珠的线程 CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{ System.out.println("召唤神龙成功"); }); for (int i = 0; i <= 7; i++) { //加final,变量会存在堆中的方法区里, //子线程共享进程的堆,所以能读到。否则会存在另一个线程的栈中,不同线程读不到 final int temp = i; new Thread(()->{ System.out.println(Thread.currentThread().getName()+"收集了"+temp); try { //通过await来计数,await之后本次线程会被阻塞, // 直到神龙召唤后,才执行后面的 cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } }).start(); } } }
8.3、Semaphore
一个计数信号量,在概念上,信号量维持一组许可证。如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它
6个车 ----> 3个停车位
public class SemaphoreDemo { public static void main(String[] args) { //线程数量:停车位 限流 Semaphore semaphore = new Semaphore(3); for (int i = 0; i <= 6; i++) { new Thread(()->{ //acquire() 得到 try { semaphore.acquire(); System.out.println(Thread.currentThread().getName() + "抢到车位"); TimeUnit.SECONDS.sleep(3); System.out.println(Thread.currentThread().getName() + "离开"); } catch (InterruptedException e) { e.printStackTrace(); }finally { //release() 释放 semaphore.release(); } },String.valueOf(i)).start(); } } }
原理:
semaphore.acquire();
得到,假如已经满了,等待,等待被释放为止
semaphore.release();
释放,会将当前的信号量 +1 然后唤醒等待的线程
作用:多个共享资源互斥的使用! 并发限流,控制最大的线程数
这篇关于55 JUC并发编程2的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-29Elasticsearch慢查询日志配置
- 2024-05-29揭秘华为如此多成功项目的产品关键——Charter模板
- 2024-05-29海外IDC业务拓展的7大挑战
- 2024-05-29InLine Chat功能优化对标Github Copilot,CodeGeeX带来更高效、更直观的编程体验!
- 2024-05-29CodeGeeX 智能编程助手 6 项功能升级,在Visual Studio插件市场霸榜2周!
- 2024-05-29AutoMQ 生态集成 Apache Doris
- 2024-05-292024年IDC行业的深度挖掘:机遇、挑战与未来展望
- 2024-05-29五款扩展组件齐发 —— Volcano、Keda、Crane-scheduler 等,邀你体验
- 2024-05-29AutoMQ 对象存储数据高效组织的秘密: Compaction
- 2024-05-29活动预告|来 GIAC 大会听大数据降本利器:AutoMQ 基于云原生重新设计的 Kafka