Java 生产者/消费者问题实例详解
发布时间 - 2026-01-11 00:42:37 点击率:次生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
以下实例演示了如何通过线程解决生产者/消费者问题:
/*
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
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用狗爹虚拟主机快速搭建网站?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
网站制作壁纸教程视频,电脑壁纸网站?
如何在阿里云域名上完成建站全流程?
javascript读取文本节点方法小结
Firefox Developer Edition开发者版本入口
如何为不同团队 ID 动态生成多个独立按钮
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Swift中switch语句区间和元组模式匹配
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
零服务器AI建站解决方案:快速部署与云端平台低成本实践
,交易猫的商品怎么发布到网站上去?
微信公众帐号开发教程之图文消息全攻略
三星网站视频制作教程下载,三星w23网页如何全屏?
如何构建满足综合性能需求的优质建站方案?
Android仿QQ列表左滑删除操作
如何快速上传建站程序避免常见错误?
Laravel如何处理异常和错误?(Handler示例)
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何快速辨别茅台真假?关键步骤解析
七夕网站制作视频,七夕大促活动怎么报名?
如何在Windows服务器上快速搭建网站?
Laravel Session怎么存储_Laravel Session驱动配置详解
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Swift开发中switch语句值绑定模式
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何用PHP快速搭建高效网站?分步指南
韩国服务器如何优化跨境访问实现高效连接?
如何在万网开始建站?分步指南解析
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
Laravel如何实现文件上传和存储?(本地与S3配置)
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Laravel中的Facade(门面)到底是什么原理
Android自定义listview布局实现上拉加载下拉刷新功能
如何在阿里云虚拟主机上快速搭建个人网站?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
如何做网站制作流程,*游戏网站怎么搭建?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
高性能网站服务器配置指南:安全稳定与高效建站核心方案
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
如何在橙子建站上传落地页?操作指南详解
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
什么是javascript作用域_全局和局部作用域有什么区别?

