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

常用的辅助类

CountDownLatch

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

使用方法

java 复制代码
package org.example.demo;

import java.util.concurrent.CountDownLatch;

//线程计数器
public class CountDownLatchDemo {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(6);//总数为6,必须要执行任务时用
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+" go out");
                countDownLatch.countDown();//总数减1
            },String.valueOf(i)).start();
        }
        try {
            countDownLatch.await();//等待总数变为0才会往下执行,相当于阻塞当前线程
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("关门");
    }
}

使用前

可能会在所有人没出去之前关门

使用后

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

原理

countDownLatch.countDown();//总数减1

countDownLatch.await();//等待总数变为0才会往下执行,相当于阻塞当前线程

每次有线程调用countDown() 数量减一,假设计数器变为0,await()就会被唤醒,继续执行!

CyclicBarrier

有减法就有加法

使用方法略有不同,一是添加了达到数量后可以执行一个方法,二十await方法放在了线程的内部

java 复制代码
package org.example.demo;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("召唤神龙成功");//在达到数量后运行一个Runnable接口方法
        });

        for (int i = 1; i <= 7; i++) {
            //lambda表达式本质上还是new了一个类,所以无法直接拿到for循环中的变量i,需要通过一个临时变量final来作为一个中间变量来获取到i
            final int temp = i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+":获取到了"+temp+"颗龙珠");

                try {
                    cyclicBarrier.await();//每次等待完成后往下执行,如果达不到数量会死在这
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } catch (BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }
            },String.valueOf(i)).start();
        }



    }
}
Semaphore

Semaphore:信号量

抢车位:6辆车3个车位,123占据了那么456就需要等待,当占据的车走后,那么等待的车就要进入该车位。

用于限流等操作

java 复制代码
package org.example.demo;

import java.sql.Time;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreDemo {
    public static void main(String[] args) {
//        线程数量:限流!让没有得到的等待释放
        Semaphore sim = new Semaphore(3);
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                //acquire 得到
                //release 释放
                try {
                    sim.acquire();
                    System.out.println(Thread.currentThread().getName()+":抢到车位");
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println(Thread.currentThread().getName()+":离开车位");

                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }finally {//所有需要关闭、释放的操作都放在finally中
                    sim.release();
                }


            }).start();
        }
    }
}

sim.acquire();//得到

sim.release();//释放

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

相关推荐
weixin_399380691 小时前
TongWeb7.0.4.9M11一键安装脚本(by sy)
java·spring
CallFay云起未来1 小时前
AI客服能不能减少人工回复?从重复咨询到人机协同的落地分析
java·大数据·人工智能·文心一言
我命由我123451 小时前
Android 开发 - 获取当前设备屏幕的旋转角度
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Elastic 中国社区官方博客1 小时前
OpenTelemetry Java 扩展:无需分叉 agent 即可自定义追踪
java·大数据·运维·开发语言·数据库·人工智能·elasticsearch
京东云开发者1 小时前
上游给空、下游拿到 -1,我把故障一直追到了 commons-beanutils 的构造函数
java·ai编程
阿无,1 小时前
Java多线程面试题之AQS
java·开发语言
数据狐(Datafox)1 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
摇滚侠2 小时前
《SpringBoot 3:入门与应用实战》第 7 章 AOP 思想与实现 阅读笔记 15
java·spring boot·笔记
风尘小子2 小时前
java静态类使用@Value动态绑定环境变量
java
重生之后端学习2 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展