首页 > 编程语言 >Java多种方式实现 有界缓冲区下的多个生产者、消费者模型 (Semaphore、while+wait+notifyAll)

Java多种方式实现 有界缓冲区下的多个生产者、消费者模型 (Semaphore、while+wait+notifyAll)

时间:2024-09-17 22:48:49浏览次数:11  
标签:multiProducerConsumer MultiProducerConsumer Java int notifyAll rate while Semaph

/**

  • @Author: Song yang Ji

  • @ProjectName: learn-multiThread

  • @Version 1.0

  • @Description:

*/

class ProducerThread extends Thread {

int rate;

MultiProducerConsumer multiProducerConsumer;

public ProducerThread(int rate, MultiProducerConsumer multiProducerConsumer) {

this.multiProducerConsumer = multiProducerConsumer;

this.rate = rate;

}

@Override

public void run() {

while (true) {

try {

multiProducerConsumer.produce();

} catch (InterruptedException e) {

e.printStackTrace();

}

try {

TimeUnit.SECONDS.sleep(rate);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

class ConsumerThread extends Thread {

int rate;

MultiProducerConsumer multiProducerConsumer;

public ConsumerThread(int rate,MultiProducerConsumer multiProducerConsumer) {

this.rate = rate;

this.multiProducerConsumer = multiProducerConsumer;

}

@Override

public void run() {

while (true) {

try {

multiProducerConsumer.consume();

} catch (InterruptedException e) {

e.printStackTrace();

}

try {

TimeUnit.SECONDS.sleep(rate);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public class MultiProducerConsumer {

// 默认缓冲区的长度

static final int DEFAULT_BUFFER_SIZE = 8;

int bufferSize;

// 缓冲数组

char[] bufferArray;

// 生产者放置产品的位置、消费者获取产品的位置 (如果是 AtomicInteger, 生产者(消费者)自身就不需要互斥了)

int putPos, pollPos;

// 生产者使用缓冲的信号量、消费者消费产品的信号量

Semaphore bufferSemaphore, availableSemaphore;

// 使用二级制信号量实现生产者、消费者各自的互斥锁,(Lock 或者其他锁形式也都是可以的)

Semaphore producerMutex, consumerMutex;

public MultiProducerConsumer() {

this(DEFAULT_BUFFER_SIZE);

}

public MultiProducerConsumer(int bufferSize) {

this.bufferSize = bufferSize;

bufferArray = new char[bufferSize];

bufferSemaphore = new Semaphore(DEFAULT_BUFFER_SIZE);

availableSemaphore = new Semaphore(0);

producerMutex = new Semaphore(1);

consumerMutex = new Semaphore(1);

}

// 生产者生产产品

void produce() throws InterruptedException {

// 若缓冲区已满,则阻塞

bufferSemaphore.acquire();

int pos;

// 原子地获取下一个放置的位置

producerMutex.acquire();

pos = putPos;

putPos = (putPos + 1) % bufferSize; // 循环下移

// 唤醒另一个因互斥而阻塞的生产者

producerMutex.release();

// 执行生产操作 (可能耗时很大)

char c = (char) ((int) ‘A’ + pos);

bufferArray[pos] = c;

System.out.printf(“生产者 %s 放置产品 %c 到 buffer[%d]\n”, Thread.currentThread().getName(), c, pos);

// 唤醒可能的消费者消费

availableSemaphore.release();

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

Mybatis面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

MySQL面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

并发编程面试专题

题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

[外链图片转存中…(img-BBkYHPHk-1726568708033)]

Mybatis面试专题

[外链图片转存中…(img-WEKlQ88s-1726568708034)]

MySQL面试专题

[外链图片转存中…(img-aRq05WPu-1726568708034)]

并发编程面试专题

标签:multiProducerConsumer,MultiProducerConsumer,Java,int,notifyAll,rate,while,Semaph
From: https://blog.csdn.net/2401_87167563/article/details/142317144

相关文章

  • Java面向对象概括
    面向对象与面向过程的思想面向过程:亲力亲为,侧重于分析过程。面向对象:所有事情交给相应的对象完成,侧重于如何创建对象。可总结为下面三点:1.都可以实现代码重用和模块化编程,但是面对对象的模块化更深,数据更封闭,也更安全!因为面向对象的封装性更强!2.面对对象的思维方式更加贴近于现......
  • Java和数据库开发规范
    java开发规范第一节:命名风格1.方法名,参数名,成员变量都统一使用lowerCamelCase风格,必须遵从驼峰形式2.类名必须使用upperCamelCase风格,但以下情形例外:DAO/BO/PO/VO/UID3.常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长4.代码中命名均不能以下......
  • JavaScript -- 数组数据类型
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......
  • JavaScript -- 数组的基本操作
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......
  • Java基于微信小程序的个人财务理财系统App+Vue[毕业设计]
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,个人财务系统APP当然不能排除在外。个人财务系统APP是在实际应用和软件工程的开发原......
  • Java基于SpringBoot的个人健康管理网站+Vue[毕业设计]
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对个人健康管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化......
  • 初学Java.Scanner
    publicclassDemo04{publicstaticvoidmain(String[]args){//我们要输入多个数字并且要求出总和与平均数,每输入一个数字用回车确认,通过输入非数字来结束输入并且执行输出结果Scannersc=newScanner(System.in);//和doublesum=0;//计算输入多少......
  • Java 学习 day02
    javaday02DtaaType数据类型Java是一门强类型的语言。1、变量变量:指的是在Java程序运行过程中,其值可以发生改变的量。定义一个变量的语句定义格式://数据类型变量名=初始化值;注意事项:1、变量要进行初始化赋值,才可以进行使用2、在同一作用域下,变量名不能重复,可以大小......
  • 基于java的城市公交查询系统Vue3+SpringBoot
    目录功能和开发技术介绍具体实现截图开发核心技术介绍:技术创新点vue3和vue2的区别:核心代码部分展示非功能需求分析系统开发流程系统运行步骤软件测试源码获取功能和开发技术介绍本课题拟采用主流的MVC架构、开发工具idea、java语言编程、MySQL数据库技术、Vue.js技......
  • java pom两个模块需要互相引用怎么办
    在Maven项目中,如果两个模块(通常称为子模块)需要互相引用,这通常意味着你的项目结构可能需要重新考虑或调整。Maven默认不支持直接的循环依赖,因为这会导致构建过程中的死锁。但是,有几种方法可以处理这种情况或避免它:1.重新设计项目结构首先,考虑是否有可能重新设计项目结构来避免循环......