博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Semaphore实现的生产者消费者程序
阅读量:4940 次
发布时间:2019-06-11

本文共 2685 字,大约阅读时间需要 8 分钟。

Semaphore:Semaphores are often used to restrict the number of threads than can access some (physical or logical) resource.

import java.util.LinkedList;import java.util.List;import java.util.Random;import java.util.concurrent.Semaphore;class Buffer {    List
buffer = new LinkedList
(); // 互斥量,控制buffer的互斥访问 private Semaphore mutex = new Semaphore(1); // canProduceCount可以生产的数量(表示缓冲区可用的数量)。 通过生产者调用acquire,减少permit数目 private Semaphore canProduceCount = new Semaphore(10); // canConsumerCount可以消费的数量。通过生产者调用release,增加permit数目 private Semaphore canConsumerCount = new Semaphore(0); Random rn = new Random(10); public void get() throws InterruptedException { canConsumerCount.acquire(); try { mutex.acquire(); int val = buffer.remove(0); System.out .println(Thread.currentThread().getName() + " 正在消费数据为:" + val + " buffer目前大小为:" + buffer.size()); } finally { mutex.release(); canProduceCount.release(); } } public void put() throws InterruptedException { canProduceCount.acquire(); try { mutex.acquire(); int val = rn.nextInt(10); buffer.add(val); System.out .println(Thread.currentThread().getName() + " 正在生产数据为:" + val + " buffer目前大小为:" + buffer.size()); } finally { mutex.release(); // 生产者调用release,增加可以消费的数量 canConsumerCount.release(); } }}public class SemaphoreProducerComsumer1 { public static void main(String[] args) { final Buffer buffer = new Buffer(); startProducer(buffer); startProducer(buffer); startConsumer(buffer); startConsumer(buffer); } public static void startProducer(final Buffer buffer) { new Thread(new Runnable() { @Override public void run() { try { while (true) { buffer.put(); } } catch (Exception e) { e.printStackTrace(); } } }).start(); } public static void startConsumer(final Buffer buffer) { new Thread(new Runnable() { @Override public void run() { try { while (true) { buffer.get(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); }}

 

转载于:https://www.cnblogs.com/leodaxin/p/7703721.html

你可能感兴趣的文章
关于粒子发射(CAEmitterLayer)
查看>>
Binding基础知识(整理)
查看>>
poj3335
查看>>
java Zip文件解压缩
查看>>
SVN源码泄露
查看>>
面试集锦
查看>>
Topcoder SRM 600 div1题解
查看>>
Windows消息+GlobalAddAtom 实现两程序通信
查看>>
sql2005 执行安装向导期间出错
查看>>
使用Angularjs需要注意的一些东西
查看>>
nodejs-npm模块管理器
查看>>
tftp 服务器的配置
查看>>
Python_base_局部变量和全局变量
查看>>
Android-Universal-Image-Loader完全解析---加载流程
查看>>
IOS 性能优化的建议和技巧
查看>>
iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)
查看>>
什么是Ajax?
查看>>
什么是商业智能BI和实施BI的解决方案
查看>>
http协议里的Last-Modified,If-Modified-Since,If-None-Match,ETag的简单理解
查看>>
js中的闭包之我理解
查看>>