第8章 JUC-辅助类
8.1 减少计数CountDownLatch
CountDownLatch类可以设置一个计数器,然后通过countDown方法来进行减1的操作,使用await方法等待计数器不大于0 ,然后继续执行await方法之后的语句。
● CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞
● 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)。
● 当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。
场景: 6个同学陆续离开教室后值班同学才可以关门。
CountDownLatchDemo
package JUC.jucAssist; import java.util.concurrent.CountDownLatch; //演示 CountDownLatch public class CountDownLatchDemo { //6个同学陆续离开教室之后,班长才可以锁门 public static void main(String[] args) throws InterruptedException { //创建CountDownLatch对象,设置初始值 CountDownLatch countDownLatch = new CountDownLatch(6); //6个同学陆续离开教室 for (int i = 1; i <= 6; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName()+" 号同学离开了教室"); //计数 -1 countDownLatch.countDown(); },String.valueOf(i)).start(); } //等待 countDownLatch.await(); System.out.println(Thread.currentThread().getName()+ " 班长锁门走人了"); } }
8.2 循环栅栏CycliBarrier
CyclicBarrier看英文单词可以看出大概就是循环阻塞的意思,在使用中CyclicBarrier的构造方法第一个参数是目标障碍数,每次执行CyclicBarrier 一次障碍数会加一,如果达到了目标障碍数,才会执行cyclicBarrier.awai()之后的语句。可以将CyclicBarrier理解为加1操作。
场景:集齐7颗龙珠就可以召唤神龙
CyclicBarrierDemos
package JUC.jucAssist; import java.util.concurrent.CyclicBarrier; //集齐7颗龙珠就可以召唤神龙 public class CyclicBarrierDemo { //创建固定值 private static final int NUMBER = 7; public static void main(String[] args) { //创建CyclicBarrier CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER,() -> { System.out.println("*****集齐7颗龙珠就可以召唤神龙"); }); //集齐七颗龙珠过程 for (int i = 1; i <= 7; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName()+ " 星龙珠被收集到了!"); try { cyclicBarrier.await(); } catch (Exception e) { e.printStackTrace(); } },String.valueOf(i)).start(); } } }
8.3 信号灯Semaphore
package JUC.jucAssist; import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; //6辆汽车,停3个车位 public class SemaphoreDemo { public static void main(String[] args) { //创建Semaphore,设置许可数量 Semaphore semaphore = new Semaphore(3); //创建6辆汽车 for (int i = 1; i <= 6; i++) { new Thread(() -> { //抢占 try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()+" 抢到了车位"); //设置随机停车时间 TimeUnit.SECONDS.sleep(new Random().nextInt(5)); System.out.println(Thread.currentThread().getName()+" ---离开了车位"); } catch (InterruptedException e) { e.printStackTrace(); } finally { //释放 semaphore.release(); } }, String.valueOf(i)).start(); } } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器