• 常用的辅助类(必会)


    1.CountDownLatch

    1. package com.kuang.add;
    2. import java.util.concurrent.CountDownLatch;
    3. //计数器 减法
    4. public class CountDownLatchDemo {
    5. public static void main(String[] args) throws InterruptedException {
    6. //总数是6,必须要执行任务的时候,再使用
    7. CountDownLatch countDownLatch = new CountDownLatch(6);
    8. for (int i = 0; i < 6; i++) {
    9. int finalI = i;
    10. new Thread(()->{
    11. try {
    12. System.out.println(Thread.currentThread().getName()+" Go Out");
    13. } catch (Exception e) {
    14. e.printStackTrace();
    15. } finally {
    16. countDownLatch.countDown();
    17. }
    18. },String.valueOf(i)).start();
    19. }
    20. countDownLatch.await();//等待计数器归零,然后再向下执行
    21. System.out.println("close Door");
    22. }
    23. }

    2.CyclicBarrier

    1. package com.kuang.add;
    2. import java.util.concurrent.BrokenBarrierException;
    3. import java.util.concurrent.CyclicBarrier;
    4. public class CyclicBarrierDemo {
    5. public static void main(String[] args) {
    6. /**
    7. * 集齐7颗龙珠 召唤神龙
    8. */
    9. //召唤龙珠的线程
    10. CyclicBarrier cyclicBarrier= new CyclicBarrier(7,()->{
    11. System.out.println("召唤神龙成功");
    12. });
    13. for (int i = 0; i < 6; i++) {
    14. int finalI = i;
    15. new Thread(()->{
    16. System.out.println(Thread.currentThread().getName()+"收集了"+ finalI+"个龙珠");
    17. try {
    18. cyclicBarrier.await();//等待
    19. } catch (InterruptedException e) {
    20. e.printStackTrace();
    21. } catch (BrokenBarrierException e) {
    22. e.printStackTrace();
    23. }
    24. }).start();
    25. }
    26. }
    27. }

     

    3.Semaphore

    Semaphore :信号量

    1. package com.kuang.add;
    2. import java.util.concurrent.Semaphore;
    3. import java.util.concurrent.TimeUnit;
    4. public class SemaphoreDemo {
    5. public static void main(String[] args) {
    6. //线程数量,停车位!
    7. Semaphore semaphore = new Semaphore(3);
    8. for (int i = 0; i < 6; i++) {
    9. new Thread(()->{
    10. //acquire()得到许可
    11. try {
    12. semaphore.acquire();
    13. System.out.println(Thread.currentThread().getName()+"抢到车位");
    14. TimeUnit.SECONDS.sleep(2);
    15. System.out.println(Thread.currentThread().getName()+"离开车位");
    16. } catch (InterruptedException e) {
    17. e.printStackTrace();
    18. }finally {
    19. semaphore.release();//release() 释放
    20. }
    21. },String.valueOf(i)).start();
    22. }
    23. }
    24. }

    原理:

    semaphore.acquire(); 获得,假设如果已经满了,等待,等待被释放为止!
    semaphore.release(); 释放,会将当前的信号量释放+1,然后唤醒等待线程!

    作用:多个共享资源互斥的使用!并发限流。控制最大的线程数!

  • 相关阅读:
    【网络安全】2023年堡垒机品牌大全
    (刘二大人)PyTorch深度学习实践-卷积网络(基础篇)
    前端开发流程
    UE常见变量并且在【细节面板】中进行修改
    使用 DFS 轻松求解数独难题(C++ 的一个简单实现)
    Qt6开发的网络通信工具(支持TCP和UDP)
    Hadoop架构、Hive相关知识点及Hive执行流程
    20道高频JavaScript面试题快问快答
    Jnpf 快速开发平台框架源码 3.4全新版本上线 java+Netcore版本 旗舰版企业版
    java标注
  • 原文地址:https://blog.csdn.net/qq_53374893/article/details/132939857