JUC并发编程学习笔记(七)常用的辅助类

打印 上一主题 下一主题

主题 932|帖子 932|积分 2796

常用的辅助类

CountDownLatch

这是一个JUC计数器辅助类,计数器有加有减,这是减。

使用方法
  1. package org.example.demo;
  2. import java.util.concurrent.CountDownLatch;
  3. //线程计数器
  4. public class CountDownLatchDemo {
  5.     public static void main(String[] args) {
  6.         CountDownLatch countDownLatch = new CountDownLatch(6);//总数为6,必须要执行任务时用
  7.         for (int i = 0; i < 6; i++) {
  8.             new Thread(()->{
  9.                 System.out.println(Thread.currentThread().getName()+" go out");
  10.                 countDownLatch.countDown();//总数减1
  11.             },String.valueOf(i)).start();
  12.         }
  13.         try {
  14.             countDownLatch.await();//等待总数变为0才会往下执行,相当于阻塞当前线程
  15.         } catch (InterruptedException e) {
  16.             throw new RuntimeException(e);
  17.         }
  18.         System.out.println("关门");
  19.     }
  20. }
复制代码
使用前
可能会在所有人没出去之前关门

使用后
不在乎谁先出去,但是一定要总数等于0后才会关门

原理
countDownLatch.countDown();//总数减1
countDownLatch.await();//等待总数变为0才会往下执行,相当于阻塞当前线程
每次有线程调用countDown() 数量减一,假设计数器变为0,await()就会被唤醒,继续执行!
CyclicBarrier

有减法就有加法

使用方法略有不同,一是添加了达到数量后可以执行一个方法,二十await方法放在了线程的内部
  1. package org.example.demo;
  2. import java.util.concurrent.BrokenBarrierException;
  3. import java.util.concurrent.CyclicBarrier;
  4. public class CyclicBarrierDemo {
  5.     public static void main(String[] args) {
  6.         CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
  7.             System.out.println("召唤神龙成功");//在达到数量后运行一个Runnable接口方法
  8.         });
  9.         for (int i = 1; i <= 7; i++) {
  10.             //lambda表达式本质上还是new了一个类,所以无法直接拿到for循环中的变量i,需要通过一个临时变量final来作为一个中间变量来获取到i
  11.             final int temp = i;
  12.             new Thread(()->{
  13.                 System.out.println(Thread.currentThread().getName()+":获取到了"+temp+"颗龙珠");
  14.                 try {
  15.                     cyclicBarrier.await();//每次等待完成后往下执行,如果达不到数量会死在这
  16.                 } catch (InterruptedException e) {
  17.                     throw new RuntimeException(e);
  18.                 } catch (BrokenBarrierException e) {
  19.                     throw new RuntimeException(e);
  20.                 }
  21.             },String.valueOf(i)).start();
  22.         }
  23.     }
  24. }
复制代码
Semaphore

Semaphore:信号量

抢车位:6辆车3个车位,123占据了那么456就需要等待,当占据的车走后,那么等待的车就要进入该车位。
用于限流等操作
  1. package org.example.demo;
  2. import java.sql.Time;
  3. import java.util.concurrent.Semaphore;
  4. import java.util.concurrent.TimeUnit;
  5. public class SemaphoreDemo {
  6.     public static void main(String[] args) {
  7. //        线程数量:限流!让没有得到的等待释放
  8.         Semaphore sim = new Semaphore(3);
  9.         for (int i = 0; i < 6; i++) {
  10.             new Thread(()->{
  11.                 //acquire 得到
  12.                 //release 释放
  13.                 try {
  14.                     sim.acquire();
  15.                     System.out.println(Thread.currentThread().getName()+":抢到车位");
  16.                     TimeUnit.SECONDS.sleep(2);
  17.                     System.out.println(Thread.currentThread().getName()+":离开车位");
  18.                 } catch (InterruptedException e) {
  19.                     throw new RuntimeException(e);
  20.                 }finally {//所有需要关闭、释放的操作都放在finally中
  21.                     sim.release();
  22.                 }
  23.             }).start();
  24.         }
  25.     }
  26. }
复制代码
sim.acquire();//得到
sim.release();//释放
作用:多个共享资源互斥的使用!并发限流,控制最大线程数!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

道家人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表