并发的三个工具类

简介: 并发的三个工具类

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();
        }
    }
}
目录
相关文章
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
767 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
10月前
|
消息中间件 中间件 Kafka
MQ四兄弟:如何实现延时消息
本文介绍了几种常见的消息队列系统(RabbitMQ、RocketMQ、Kafka和Pulsar)实现延时消息的方式。RabbitMQ通过死信队列或延时插件实现;RocketMQ内置延时消息支持,可通过设置`delayTimeLevel`属性实现;Kafka不直接支持延时消息,但可以通过时间戳、延时Topic、Kafka Streams等方法间接实现;Pulsar自带延时消息功能,提供`deliverAfter`和`deliverAt`两种方式。每种方案各有优劣,适用于不同的应用场景。
913 0
|
12月前
|
SQL 关系型数据库 MySQL
Vanna使用ollama分析本地数据库
这篇文章详细介绍了如何使用Vanna和Ollama框架来分析本地数据库,实现自然语言查询转换为SQL语句并与数据库交互的过程。
2451 7
Vanna使用ollama分析本地数据库
|
消息中间件 存储 负载均衡
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK
323 81
【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ或Kafka的选择理由以及二者PK
|
测试技术 开发工具 git
git commit message——git提交日志规范备忘
使用git提交时,最好能注意保持规范,可能某些公司对这方面没有要求,但是提交日志不规范的话,不方便查阅和管理。 在此记录下commit的类别,备忘,更详细的介绍,可以查看文末链接。
356 0
|
XML 存储 Java
Activiti7工作流
Activiti7工作流
1123 0
Activiti7工作流
|
消息中间件 存储 Dubbo
面试官:你是如何评估一个线程池需要设置多少个线程
面试官:你是如何评估一个线程池需要设置多少个线程
面试官:你是如何评估一个线程池需要设置多少个线程
|
JavaScript 网络协议 PHP
使用阿里云npm镜像加速
npm(node package manager)是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用。 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。 由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 &quot;npm -v&quot; 来测试是否成功安装。命令如下,出现版本提示表示安装成功
52554 4
|
7天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!