-信号量(Semaphore)在生产者和消费者模式的使用

2023-05-16

转自:  http://blog.csdn.net/java2000_net/article/details/3997449

Semaphore 信号量,就是一个允许实现设置好的令牌。也许有1个,也许有10个或更多。 
谁拿到令牌(acquire)就可以去执行了,如果没有令牌则需要等待。 
执行完毕,一定要归还(release)令牌,否则令牌会被很快用光,别的线程就无法获得令牌而执行下去了。

 

请仔细体会里面关于仓库的处理,

1 是如何保证入库时,如果仓库满就等待,

2 出库时,如果仓库无货就等待的。

3 以及对仓库只有10个库位的处理。

4 对同步问题的处理。

 

 

[java]  view plain copy
  1. import java.util.concurrent.Semaphore;  
  2. /** 
  3.  * 老紫竹JAVA提高教程-信号量(Semaphore)的使用。<br> 
  4.  * 生产者和消费者的例子,库存的管理。 
  5.  *  
  6.  * @author 老紫竹(java2000.net,laozizhu.com) 
  7.  */  
  8. public class TestSemaphore {  
  9.   public static void main(String[] args) {  
  10.     // 启动线程  
  11.     for (int i = 0; i <= 3; i++) {  
  12.       // 生产者  
  13.       new Thread(new Producer()).start();  
  14.       // 消费者  
  15.       new Thread(new Consumer()).start();  
  16.     }  
  17.   }  
  18.   // 仓库  
  19.   static Warehouse buffer = new Warehouse();  
  20.   // 生产者,负责增加  
  21.   static class Producer implements Runnable {  
  22.     static int num = 1;  
  23.     @Override  
  24.     public void run() {  
  25.       int n = num++;  
  26.       while (true) {  
  27.         try {  
  28.           buffer.put(n);  
  29.           System.out.println(">" + n);  
  30.           // 速度较快。休息10毫秒  
  31.           Thread.sleep(10);  
  32.         } catch (InterruptedException e) {  
  33.           e.printStackTrace();  
  34.         }  
  35.       }  
  36.     }  
  37.   }  
  38.   // 消费者,负责减少  
  39.   static class Consumer implements Runnable {  
  40.     @Override  
  41.     public void run() {  
  42.       while (true) {  
  43.         try {  
  44.           System.out.println("<" + buffer.take());  
  45.           // 速度较慢,休息1000毫秒  
  46.           Thread.sleep(1000);  
  47.         } catch (InterruptedException e) {  
  48.           e.printStackTrace();  
  49.         }  
  50.       }  
  51.     }  
  52.   }  
  53.   /** 
  54.    * 仓库 
  55.    *  
  56.    * @author 老紫竹(laozizhu.com) 
  57.    */  
  58.   static class Warehouse {  
  59.     // 非满锁  
  60.     final Semaphore notFull = new Semaphore(10);  
  61.     // 非空锁  
  62.     final Semaphore notEmpty = new Semaphore(0);  
  63.     // 核心锁  
  64.     final Semaphore mutex = new Semaphore(1);  
  65.     // 库存容量  
  66.     final Object[] items = new Object[10];  
  67.     int putptr, takeptr, count;  
  68.     /** 
  69.      * 把商品放入仓库.<br> 
  70.      *  
  71.      * @param x 
  72.      * @throws InterruptedException 
  73.      */  
  74.     public void put(Object x) throws InterruptedException {  
  75.       // 保证非满  
  76.       notFull.acquire();  
  77.       // 保证不冲突  
  78.       mutex.acquire();  
  79.       try {  
  80.         // 增加库存  
  81.         items[putptr] = x;  
  82.         if (++putptr == items.length)  
  83.           putptr = 0;  
  84.         ++count;  
  85.       } finally {  
  86.         // 退出核心区  
  87.         mutex.release();  
  88.         // 增加非空信号量,允许获取商品  
  89.         notEmpty.release();  
  90.       }  
  91.     }  
  92.     /** 
  93.      * 从仓库获取商品 
  94.      *  
  95.      * @return 
  96.      * @throws InterruptedException 
  97.      */  
  98.     public Object take() throws InterruptedException {  
  99.       // 保证非空  
  100.       notEmpty.acquire();  
  101.       // 核心区  
  102.       mutex.acquire();  
  103.       try {  
  104.         // 减少库存  
  105.         Object x = items[takeptr];  
  106.         if (++takeptr == items.length)  
  107.           takeptr = 0;  
  108.         --count;  
  109.         return x;  
  110.       } finally {  
  111.         // 退出核心区  
  112.         mutex.release();  
  113.         // 增加非满的信号量,允许加入商品  
  114.         notFull.release();  
  115.       }  
  116.     }  
  117.   }  
  118. }  

更多 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

-信号量(Semaphore)在生产者和消费者模式的使用 的相关文章

  • mac M1使用goland无法进行调试

    首先查看go的版本查看是否是arm版本的eg xff1a go version go version go1 16 13 darwin arm64 然后查看你的goland版本是否是Apple Sillicon版本 下载apple版本的go
  • 忘了自己是从哪里下载的源码?查看git clone的历史

    有时候忘记自己是从哪个地方下载的源码了 xff0c 这时候可以进入git clone的文件夹根目录 xff0c 在该处打开终端并输入 span class token function git span reflog date span c
  • 【详细步骤】Ubuntu18.04开启SSH服务,使用MobaXterm客户端进行远程登录

    熟悉linux的小伙伴 xff0c 都或多或少会接触到ssh服务 使用MobaXterm远程登录Ubuntu那感觉 xff0c 真是太 爽了 本人推荐此方法原因如下 xff1a 1 颜控 xff0c Ubuntu原生界面太丑 2 方便 xf
  • cuda-trt 学习

    https github com jinmin527 learning cuda trt learning cuda trt A large number of cuda tensorrt cases在这个project中 xff0c 提供
  • 时序知识图谱推理:Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs

    0摘要 xff1a 带有时间戳的大规模事件数据的可用性催生了边带有时间的动态知识图谱 在动态的知识图谱中 xff0c 并没有被很好的理解 基于此 xff0c 本文提出Know Evolve xff0c 这是一种新颖的深度进化知识网络 xff
  • 《机器学习实战》源码和数据集的下载

    机器学习实战 这本书对于我们了解机器学习原理和代码实现提供了很大的帮助 xff0c 源码和数据集可在其英文版的官方网站进行下载 xff1a https www manning com books machine learning in ac
  • VNC Viewer :Timed out waiting for a response from the computer

    阿里云主机 xff0c Ubuntu系统 xff0c 通过VNC viewer连接出现超时问题 解决方案 xff1a 首先检查在阿里云主机添加5801 5810 xff1b 5901 5910端口是否开启 查找步骤如下图 xff1a 1 点
  • 从零开始系列(二):数据库基础篇

    从零开始系列 xff08 二 xff09 xff1a 数据库基础篇 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的博客 从零开始系列 xff08 三 xff09 xff1a W
  • 从零开始系列(三):Windows10安装Linux子系统(WSL教程)

    从零开始系列 xff08 三 xff09 xff1a Windows10安装Linux子系统 xff08 WSL教程 xff09 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的
  • 从零开始系列(四):一文看懂arm架构和x86架构有什么区别

    从零开始系列 xff08 四 xff09 xff1a 一文看懂arm架构和x86架构有什么区别 相关系列文章推荐 xff1a 从零开始系列 xff08 一 xff09 xff1a 在github上搭建自己的博客 从零开始系列 xff08 二
  • NVIDIA显卡及架构介绍

    版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 xff1b 本博客的内容来自于 xff1a NVIDIA显卡及架构介绍 xff1b 学习 合作与交流联系q384660
  • 脉冲神经网络资料汇总

    往期文章推荐 xff1a 损失函数与代价函数 神经网络从入门到精通 脉冲神经网络综述笔记 版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 xff1b 本博客的内容来自
  • 什么是NAS

    一 NAS是什么 简单的说就是连接在网络上 xff0c 让大家可以透过网络 xff08 内网 xff0c 外网 xff09 来进行储存和读取资料的设备 通俗点说 xff0c 就是有一台很小很小的台式主机 xff0c 里面只装了很多颗的磁盘
  • numba安装与使用

    一 numba是什么 Numba是一个针对Python的开源JIT编译器 xff0c 由Anaconda公司主导开发 xff0c 可以对Python原生代码进行CPU和GPU加速 Numba对NumPy数组和函数非常友好 解释器可以参考第四
  • 目标检测中算法评价指标FPS

    一 FPS 每秒传输帧数 Frames Per Second 是什么 FPS就是目标网络每秒可以处理 xff08 检测 xff09 多少帧 多少张图片 FPS简单来理解就是图像的刷新频率 xff0c 也就是每秒多少帧 假设目标检测网络处理1
  • pytorch版本对计算能力的要求

    一 pytorch对计算能力要求 首先查看pytorch是否可用cuda完整流程应该是先查看是否在当前环境下的python In span class token punctuation span span class token numb
  • 在VS2013中配置boost_1_58_0过程和遇到的的问题

    Boost是为C 43 43 语言标准库提供扩展的一些C 43 43 程序库的总称 Boost库是一个可移植 提供源代码的C 43 43 库 xff0c 作为标准库的后备 xff0c 是C 43 43 标准化进程的开发引擎之一 xff0c
  • C语言学习专栏(1):易忘点

    C语言学习专栏系列 xff1a 版权申明 未经博主同意 xff0c 谢绝转载 xff01 xff08 请尊重原创 xff0c 博主保留追究权 xff09 xff1b 本博客的内容来自于 xff1a C语言学习专栏 xff08 1 xff09
  • git如何配置模板文件

    git如何创建模板文件 创建xxx template文件 xff0c 其内容为团队制定的Git提交注释规范 xff0c 如 xff1a Desgraption Date Author 通过git config命令配置commit templ
  • iOS很坑的error:

    iOS错误如下 error using bridging headers with module interfaces is unsupported 仔细看好错误类型 xff0c 是关于swift混合编译问题 解决办法 完美解决 xff0c

随机推荐