并发的三个工具类

简介: 并发的三个工具类

1、CountDownLatch

计数器

package com.juc.ofok.demo;
import java.util.concurrent.CountDownLatch;
/**
 * 代码源于生活,高于生活
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class CountDownLatchDemo {
    /**
     *  有些任务是不得不阻塞的, 减法计数器
     */
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 0; i <= countDownLatch.getCount(); i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " start ");
                // 出去一个人计数器就减 -1
                countDownLatch.countDown();
            }, String.valueOf(i)).start();
        }
        // 阻塞等待计数器归零
        countDownLatch.await();
        // 阻塞的操作:计数器 num++
        System.out.println(Thread.currentThread().getName() + " === END ");
    }
    /**
     *  结果诡异的嘛?达不到预期的 Main end 在最后一个
     */
    public static void test1() {
        for (int i = 1; i <= 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+" start ");
            }, String.valueOf(i)).start();
        }
        System.out.println(Thread.currentThread().getName() + " End ");
    }
}

CountDownLatch countDownLatch = new CountDownLatch(6);

countDownLatch.countDown(); 出去一个人计数器就 -1

countDownLatch.await(); 阻塞等待计数器归零

2、CyclicBarrier 回环栅栏 计数器加法

package com.ofok.juc.demo;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
 * 代码源于生活,高于生活
 * 回环栅栏 计数器加法
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        // 集齐7个龙珠召唤神龙 ++ 1//
        // 等待cyclicBarrier计数器满,就执行后面的Runnable,不满就阻塞
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, new Runnable() {
            @Override
            public void run() {
                System.out.println("神龙召唤成功!");
            }
        });
        for (int i = 1; i <= 7; i++) {
            final int temp = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "收集了第" + temp + "颗龙珠");
                try {
                    cyclicBarrier.await();
                    // 等待 阻塞
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
    }
}

3、信号量(信号灯)

package com.ofok.juc.demo;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
 * 代码源于生活,高于生活
 * 信号量(信号灯) 抢车位
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class SemaphoreDemo {
    public static void main(String[] args) {
        // 模拟6个车,只有3个车位
        // 3个位置
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                // 得到车位
                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 {
                    // 释放位置
                    semaphore.release();
                }
            }, String.valueOf(i)).start();
        }
    }
}
目录
相关文章
|
监控 算法
探秘Guava的RateLimiter:单机流量控制的黄金法宝
探秘Guava的RateLimiter:单机流量控制的黄金法宝
503 0
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
883 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
2月前
|
人工智能 运维 专有云
持续领先!阿里云入选2025年Gartner®分布式混合基础设施魔力象限
近日,Gartner发布2025年《分布式混合基础设施魔力象限》报告,在混合云场景下,阿里云凭借飞天企业版(Apsara Stack)、边缘云ENS和云盒CloudBox产品组合能力,在“执行能力”和“愿景完整性”两大维度分别处于亚太厂商中最高最远的位置。
205 6
|
SQL 关系型数据库 MySQL
Vanna使用ollama分析本地数据库
这篇文章详细介绍了如何使用Vanna和Ollama框架来分析本地数据库,实现自然语言查询转换为SQL语句并与数据库交互的过程。
2603 7
Vanna使用ollama分析本地数据库
|
12月前
|
消息中间件 中间件 Kafka
MQ四兄弟:如何实现延时消息
本文介绍了几种常见的消息队列系统(RabbitMQ、RocketMQ、Kafka和Pulsar)实现延时消息的方式。RabbitMQ通过死信队列或延时插件实现;RocketMQ内置延时消息支持,可通过设置`delayTimeLevel`属性实现;Kafka不直接支持延时消息,但可以通过时间戳、延时Topic、Kafka Streams等方法间接实现;Pulsar自带延时消息功能,提供`deliverAfter`和`deliverAt`两种方式。每种方案各有优劣,适用于不同的应用场景。
1205 0
|
消息中间件 存储 负载均衡
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK
532 79
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK
|
监控 安全 算法
提升编程效率的利器: 解析Google Guava库之RateLimiter优雅限流(十)
提升编程效率的利器: 解析Google Guava库之RateLimiter优雅限流(十)
|
传感器 数据采集 算法
LabVIEW中PID控制器系统的噪声与扰动抑制策略
LabVIEW中PID控制器系统的噪声与扰动抑制策略
426 21
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】Chameleon多模态模型探究
【机器学习】Chameleon多模态模型探究
471 5
|
数据可视化 算法 数据挖掘
bayesplot|分享一个可视化贝叶斯模型的R包
`bayesplot` 是一个用于贝叶斯模型可视化的R包,专注于MCMC样本的分析。它提供了后验分布图(如密度图、直方图和区间图)、MCMC诊断图(如追踪图和自相关图)、后验预测检查以及模型比较和评估工具。DEMO展示了如何使用`bayesplot`绘制后验分布、后验预测检查图以及MCMC链的轨迹图和能量诊断图。这些图帮助评估模型的收敛性、预测能力及不确定性。
351 0