生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
以下实例演示了如何通过线程解决生产者/消费者问题:
/*
author by w3cschool.cc
ProducerConsumerTest.java
*/
public class ProducerConsumerTest {
public static void main(String[] args) {
CubbyHole c = new CubbyHole();
Producer p1 = new Producer(c, 1);
Consumer c1 = new Consumer(c, 1);
p1.start();
c1.start();
}
}
class CubbyHole {
private int contents;
private boolean available = false;
public synchronized int get() {
while (available == false) {
try {
wait();
}
catch (InterruptedException e) {
}
}
available = false;
notifyAll();
return contents;
}
public synchronized void put(int value) {
while (available == true) {
try {
wait();
}
catch (InterruptedException e) {
}
}
contents = value;
available = true;
notifyAll();
}
}
class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get();
System.out.println("消费者 #" + this.number+ " got: " + value);
}
}
}
class Producer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
System.out.println("生产者 #" + this.number + " put: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
}
以上代码运行输出结果为:
消费者 #1 got: 0 生产者 #1 put: 0 生产者 #1 put: 1 消费者 #1 got: 1 生产者 #1 put: 2 消费者 #1 got: 2 生产者 #1 put: 3 消费者 #1 got: 3 生产者 #1 put: 4 消费者 #1 got: 4 生产者 #1 put: 5 消费者 #1 got: 5 生产者 #1 put: 6 消费者 #1 got: 6 生产者 #1 put: 7 消费者 #1 got: 7 生产者 #1 put: 8 消费者 #1 got: 8 生产者 #1 put: 9 消费者 #1 got: 9
希望本篇文章对您有所帮助
# Java
# 生产者/消费者实例
# Java生产者消费者
# Java实现Kafka生产者消费者代码实例
# Java基于Lock的生产者消费者模型示例
# kafka生产者和消费者的javaAPI的示例代码
# 基于Java 生产者消费者模式(详细分析)
# Java实现生产者消费者问题与读者写者问题详解
# Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解
# JAVA多线程实现生产者消费者的实例详解
# Java多种方式实现生产者消费者模式
# 等着
# 死锁
# 问题是
# 所示
# 对您
# 已满
# 如下图
# 用着
# 而向
# 时间段内
# 在同一
# public
# static
# ProducerConsumerTest
# w3cschool
# cc
# String
# args
# CubbyHole
# void
相关文章:
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
,怎么用自己头像做动态表情包?
如何在建站之星绑定自定义域名?
定制建站方案优化指南:企业官网开发与建站费用解析
北京的网站制作公司有哪些,哪个视频网站最好?
javascript中的try catch异常捕获机制用法分析
如何通过虚拟主机快速完成网站搭建?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
制作网站的模板软件,网站怎么建设?
C#怎么使用委托和事件 C# delegate与event编程方法
佛山网站制作系统,佛山企业变更地址网上办理步骤?
香港服务器租用每月最低只需15元?
建站之星如何通过成品分离优化网站效率?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何高效搭建专业期货交易平台网站?
如何快速使用云服务器搭建个人网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何通过山东自助建站平台快速注册域名?
安云自助建站系统如何快速提升SEO排名?
如何在IIS7上新建站点并设置安全权限?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
如何访问已购建站主机并解决登录问题?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
网站制作公司,橙子建站是合法的吗?
建站之星如何实现五合一智能建站与营销推广?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
,制作一个手机app网站要多少钱?
如何通过二级域名建站提升品牌影响力?
如何在腾讯云免费申请建站?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
建站主机SSH密钥生成步骤及常见问题解答?
,购物网站怎么盈利呢?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
公众号网站制作网页,微信公众号怎么制作?
黑客如何通过漏洞一步步攻陷网站服务器?
如何在阿里云虚拟服务器快速搭建网站?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何在建站之星网店版论坛获取技术支持?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
活动邀请函制作网站有哪些,活动邀请函文案?
如何快速上传建站程序避免常见错误?
建站之星备案是否影响网站上线时间?
建站之星如何一键生成手机站?
宿州网站制作公司兴策,安徽省低保查询网站?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
建站主机空间推荐 高性价比配置与快速部署方案解析
如何快速搭建安全的FTP站点?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。