首页 > 其他分享 >信号量Semaphore的使用

信号量Semaphore的使用

时间:2023-10-29 18:04:23浏览次数:40  
标签:INFO Thread ThreadTest4 lyy 停车场 信号量 使用 Semaphore

Semaphore 是jdk中提供的用来限制资源可以同时被几个线程访问的工具类,它底层也是用aqs实现的。

以现实生活中停车场的例子来举例,一个停车场总的车位数是固定的,

@Slf4j
public class ThreadTest4 {
    public static void main(String[] args) {
        //假设只能停两辆车
        Semaphore semaphore = new Semaphore(2);
        for (int i = 0; i < 3; i++) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        semaphore.acquire();//获取一个车位
                        log.info("停车");
                        Thread.sleep(5000);
                        semaphore.release();//离开停车场
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }
}

//控制台输出 只有前两个车中某一个车离开后第三辆车才能进入停车场
17:32:46.610 [Thread-0] INFO com.lyy.service.thread.ThreadTest4 - 停车
17:32:46.610 [Thread-1] INFO com.lyy.service.thread.ThreadTest4 - 停车
17:32:51.621 [Thread-2] INFO com.lyy.service.thread.ThreadTest4 - 停车

这就是信号量Semaphore 的一个简单使用

标签:INFO,Thread,ThreadTest4,lyy,停车场,信号量,使用,Semaphore
From: https://www.cnblogs.com/chengxuxiaoyuan/p/17796108.html

相关文章

  • 解决使用 OkHttp 库出现 java.lang.NoSuchMethodError: okhttp3.internal.platform.Pl
    报错:Exceptioninthread"main"java.lang.NoSuchMethodError:okhttp3.internal.platform.Platform.log(ILjava/lang/String;Ljava/lang/Throwable;)Vatokhttp3.logging.HttpLoggingInterceptor$Logger.lambda$static$0(HttpLoggingInterceptor.java:112)......
  • 如何使用中间件
    1.注册varbuilder=WebApplication.CreateBuilder(args);varapp=builder.Build();app.Map("/test",asyncappbuilder=>{appbuilder.Use(async(context,next)=>{context.Response.ContentType="text/html";......
  • Python使用pymysql和xlrd2将Excel数据导入MySQL数据库
    在数据处理和管理中,有时候需要将Excel文件中的数据导入到MySQL数据库中进行进一步的分析和操作。本文将介绍如何使用Python编程语言实现这个过程。导入所需库importxlrd2#导入xlrd2库,用于读取Excel文件importpymysql#导入pymysql库,用于连接和操作MySQL数据库fromdat......
  • C++多线程编程——线程的基本概念和使用方法
    什么是线程?在计算机科学中,线程是进程中的一个执行控制单元,也被称为执行路径。每个进程可以包含多个线程,每条线程并行执行不同的任务。线程是操作系统可识别的最小执行和调度单位。进程和线程的区别进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的......
  • WinGet 换国内源使用帮助
    修改WinGet软件源需要管理员权限,请以管理员身份运行终端。替换USTC镜像:wingetsourceremovewingetwingetsourceaddwingethttps://mirrors.ustc.edu.cn/winget-source若出现0x80073d1b:smartscreenreputationcheckfailed.错误,请检查网络连接或暂时关闭SmartScree......
  • 使用 Chrome 开发者工具去除某些网站上无法关闭的模态对话框
    有些网页设计得具有缺陷,模态对话框弹出来之后,找不到关闭按钮,导致对话框关闭不掉,很尴尬。其实可以通过使用Chrome开发者工具移除模态对话框对应的DOM元素,来实现去除模态对话框的目的。具体操作步骤:打开Chrome开发者工具,切换到Elements标签页,找到模态对话框对应的DOM元......
  • 使用 excel 快速拼接省市区镇街村居五级区划完整名称
    你知道的越多,你不知道的越多点赞再看,养成习惯文章目录前言数据准备excel函数附件前言之前做了国家区划的映射关系,在其过程中,使用代码区拼接完整的五级区划,感觉还是比较麻烦的,后面偶然在excel上发现可以使用函数去完成这个拼接操作,记录一下方法。数据准备首先需要准备3个广......
  • 如何使用scp从远程复制文件夹到本地?
    内容来自DOChttps://q.houxu6.top/?s=HowdoIcopyafolderfromremotetolocalusingscp?如何使用scp从远程复制文件夹到本地主机?我使用ssh登录到我的服务器。然后,我想要将远程文件夹foo复制到本地/home/user/Desktop。我该如何实现这一点?[email protected]......
  • 什么情况下你会使用AI工具(chatgpt、bard)?
    在当今数字化和智能化的时代,AI工具已成为许多领域的常见工具。在本文中,我将探讨什么情况下会使用AI工具。ChatGPT是一款由OpenAI开发的大型语言模型,可以生成文本、翻译语言、编写不同类型的创意内容,并以信息丰富的方式回答你的问题。它是目前最先进的聊天机器人之一,具有广泛的应用......
  • Python 模块:创建、导入和使用
    什么是模块?将模块视为代码库。模块是一个包含一组函数的文件,您想要在应用程序中包含这些函数。创建一个模块要创建一个模块,只需将要包含在其中的代码保存在扩展名为.py的文件中:示例:将以下代码保存在名为mymodule.py的文件中:defgreeting(name):print("Hello,"+name)......