Semaphore自白:限流器用我就对了!(2)

简介: Semaphore自白:限流器用我就对了!(2)

项目经验


接下来,咱们使用代码的方式来演示 Semaphore 的使用。我们以停车场的限流为例,假设整个停车场只有 2 个车位(车位虽少,但足矣说明问题),但来停车的却有 5 辆车,显然车位不够用了,此时需要保证停车场最多只能有 2 辆车,接下来咱们使用 Semaphore 来实现车辆的限流功能,具体实现代码如下:


import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
 * Author:磊哥
 * By:Java中文社群
 */
publicclass SemaphoreExample {
    // 创建信号量
    static Semaphore semaphore = new Semaphore(2);
    public static void main(String[] args) {
        // 创建 5 个固定的线程数
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        // 定义执行任务
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 拿到当前线程的名称
                String tname = Thread.currentThread().getName();
                System.out.println(String.format("老司机:%s,停车场外排队,时间:%s",
                        tname, new Date()));
                try {
                    // 执行此行,让所有线程先排队等待进入停车场
                    Thread.sleep(100);
                    // 执行阻塞
                    semaphore.acquire();
                    System.out.println(String.format("老司机:%s,已进入停车场,时间:%s",
                            tname, new Date()));
                    Thread.sleep(1000);
                    System.out.println(String.format("老司机:%s,离开停车场,时间:%s",
                            tname, new Date()));
                    // 释放锁
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        // 执行任务 1
        threadPool.submit(runnable);
        // 执行任务 2
        threadPool.submit(runnable);
        // 执行任务 3
        threadPool.submit(runnable);
        // 执行任务 4
        threadPool.submit(runnable);
        // 执行任务 5
        threadPool.submit(runnable);
        // 等线程池任务执行完之后关闭
        threadPool.shutdown();
    }
}


以上代码的执行结果如下:


微信图片_20220120181101.jpg


从上述的结果我们可以看出,当有 5 辆车同时需要进入停车场时,因为停车场的停车位只有 2 个,所以停车场最多只能容纳 2 辆车。此时我们通过 Semaphore 的 acquire 方法(阻塞等待)和 release 方法(颁发一个证书)顺利的实现了限流的功能,让停车场的车辆数始终控制在 2 辆车以下(等于或小于 2 辆车)。

相关文章
|
7月前
|
算法 Java 调度
【多线程面试题二十】、 如何实现互斥锁(mutex)?
这篇文章讨论了在Java中实现互斥锁(mutex)的两种方式:使用`synchronized`关键字进行块结构同步,以及使用`java.util.concurrent.locks.Lock`接口进行非块结构同步,后者提供了更灵活的同步机制和扩展性。
|
10月前
|
Java 数据库
Semaphore(信号量)源码解读与使用
Semaphore(信号量)源码解读与使用
|
10月前
|
安全 Java 开发工具
Semaphore:实现一个限流器
Semaphore:实现一个限流器
81 0
|
10月前
|
安全 Java
java多线程之Lock锁原理以及案例实现电影院卖票
java多线程之Lock锁原理以及案例实现电影院卖票
114 0
|
安全 Java
JUC第十一讲:JUC锁LockSupport详解
JUC第十一讲:JUC锁LockSupport详解
152 0
|
缓存 数据处理
JUC第十四讲:JUC锁: ReentrantReadWriteLock详解
JUC第十四讲:JUC锁: ReentrantReadWriteLock详解
112 0
|
存储 缓存 监控
【Java并发编程 十二】JUC并发包下线程池(上)
【Java并发编程 十二】JUC并发包下线程池(上)
70 0
|
存储 缓存 Java
【Java并发编程 十二】JUC并发包下线程池(下)
【Java并发编程 十二】JUC并发包下线程池(下)
70 0
|
存储 缓存 开发框架
JUC系列(九)| ThreadPool 线程池
JUC系列(九)| ThreadPool 线程池
129 0
JUC系列(九)| ThreadPool 线程池
|
安全 C# 数据安全/隐私保护
C#(四十三)之线程Mutex互斥
Mutex(互斥体): 排他性的使用共享资源称为线程间的互斥。 使用Mutex类要比使用monitor类消耗更多的系统资源,但他可以跨越多个应用程序,在多个应用程序间同步。
235 0
C#(四十三)之线程Mutex互斥