java Semaphore‌

Java Semaphore 用于控制同时访问特定资源的线程数量,通过管理一组"许可"(permits)实现并发限制。

模拟6人上厕所,但只有两个坑位,测试代码:

java 复制代码
import java.util.concurrent.Semaphore;

    // 假设厕所只有俩个坑位,模拟6人上厕所
    private static void testSemaphore() {
        int count = 2; // 坑位数量
        // 创建Semaphore(2个许可证, 同一时刻最多2个线程能获取到许可),
        // 许可证就相当于需要竞争的资源(这里是厕所坑位资源)
        Semaphore semaphore = new Semaphore(count);  
        // 6人竞争资源, 假设每个线程为一个等待上厕所的人。
        String[] people = {"田伯光", "灭绝师太", "陆小凤", "周伯通", "赵钱孙", "黄老邪"}; // 等待上厕所的人
        for (int i = 0; i < people.length; i++) {
            int finalI = i;
            new Thread(() -> {
                try {
                    System.out.println(people[finalI] + " 等待上厕所 " + getNowTimeStr());
                    semaphore.acquire(); // 获取1个许可 ,也可以这样调用:semaphore.acquire(1)
                    System.out.println(people[finalI] + " 占用厕所1个坑位 " + getNowTimeStr());
                    Thread.sleep(1000); // 模拟资源使用(即蹲坑的过程)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    System.out.println(people[finalI] + " 爽完了,释放厕所1个坑位 " + getNowTimeStr());
                    semaphore.release(); // 释放许可
                }
            }).start();
        }
    }

    private static String getNowTimeStr() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date());
    }

打印:

ok. 结果符合预期。

相关推荐
Chester_19993 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲4 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员4 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导4 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan4 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251495 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
2601_961901705 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
何以解忧,唯有..5 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
大衛說6 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
QQ_21696290966 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端