忘记哪转的了,对不起作者了。
/*
* Java 生产者-消费者案例框架
*“生产者-消费者”问题的含义是,
*系统中有很多生产者和消费者并
*发工作生产者负责生产资源,消费者消耗资源。
*当消费者消费资源时,如果资源不足,则需要等待,
*反之当生产者生产资源时,若资源已满,则也需要等待。
*另外同一时刻只能有一个生产者或消费者进行操作。
*/
//面包容器(资源)
class BreadContainer
{
// 容器的最大容量
public static final int maxNum = 300;
// 当前面包的数量
private int num;
// 无参构造器
public BreadContainer()
{
}
// 有参构造器
public BreadContainer(int num)
{
// 初始化面包数量
this.num = num;
}
// 制作面包的同步方法
public synchronized void produceBread(int produceNum, String ProducerSName)
{
// 测试是否可以生产面包
while (num + produceNum > maxNum)
{
// 面包充足,生产者等待
System.out.println(ProducerSName + "要生产" + produceNum + "个,当前" + num
+ "个,资源充足,不需要生产," + ProducerSName + "去等待!");
try
{
wait();
}
catch (Exception e)
{
e.printStackTrace();
}
}
// 满足条件后,生产者生产面包,刷新数量
num = num + produceNum;
System.out.println(ProducerSName + "生产了" + produceNum + "个,现在有" + num
+ "个。");
// 唤醒资源等待池中的所有线程
notifyAll();
}
public synchronized void consumeBread(int consumeNum, String ConsumerSName)
{
// 测试面包数量是否够消费
while (consumeNum > num)
{
// 不够数量,消费者等待
System.out.println(ConsumerSName + "要消费" + consumeNum + "个,由于现在只有"
+ num + "个," + ConsumerSName + "于是去等待!");
try
{
wait();
}
catch (Exception e)
{
e.printStackTrace();
}
}
// 数量充足,消费面包,刷新数量
num = num - consumeNum;
System.out.println(ConsumerSName + "消费了" + consumeNum + "个,现在还剩下" + num
+ "个");
// 唤醒资源等待池中的所有线程
this.notifyAll();
}
}
// 生产者类
class ProducerS extends Thread
{
// 记录该生产者一次生产的数量
private int produceNum;
// 生产者需要访问的面包容器资源
private BreadContainer bc;
// 无参构造器
public ProducerS()
{
}
// 有参构造器
public ProducerS(int produceNum, BreadContainer bc, String ProducerSName)
{
// 对线程进行初始化
this.produceNum = produceNum;
this.bc = bc;
this.setName(ProducerSName);
}
// 生产者的工作方法
public void run()
{
// 调用资源容器的同步方法生产资源
bc.produceBread(produceNum, this.getName());
}
}
// 消费者类
class ConsumerS extends Thread
{
// 记录该消费者一次消费的数量
private int consumeNum;
// 消费者需要访问的面包容器资源
private BreadContainer bc;
// 无参构造器
public ConsumerS()
{
}
// 有参构造器
public ConsumerS(int consumeNum, BreadContainer bc, String ConsumerSName)
{
// 对线程进行初始化
this.consumeNum = consumeNum;
this.bc = bc;
this.setName(ConsumerSName);
}
// 消费者的行为方法
public void run()
{
// 调用资源容器的同步方法生产资源
bc.consumeBread(consumeNum, this.getName());
}
}
public class Sample16_9
{
public static void main(String args[])
{
// 创建资源对象,初始面包有50个
BreadContainer bc = new BreadContainer(50);
// 创建对应的生产者和消费者
ProducerS p1 = new ProducerS(50, bc, "P1");
ProducerS p2 = new ProducerS(200, bc, "P2");
ProducerS p3 = new ProducerS(290, bc, "P3");
ConsumerS c1 = new ConsumerS(70, bc, "c1");
ConsumerS c2 = new ConsumerS(80, bc, "c2");
// 启动生产者消费者线程
c1.start();
c2.start();
p1.start();
p3.start();
p2.start();
}
}
分享到:
相关推荐
在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
生产者消费者模式是一种设计模式,它描述了两个不同类型的线程如何协作完成工作:生产者负责生成数据,而消费者负责消耗这些数据。为了使这个模式在多线程环境下安全运行,我们需要使用Java中的同步机制。 1. **...
总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...
Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...
java多线程学习,生产者消费者问题示例
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
基本满足操作系统课上要求,java实现的生产者消费者模型。
关于java多线程的东西,里面有生产者与消费者的案例,感兴趣的朋友看一下吧。
Java多线程生产者消费者基础示例,IT大厂如华为等基础面试中经常出现的Java基础笔试题目,使用最基本的线程同步、Notify及wait等实现最基本的生产者消费者例程,适用于Java编程初学者了解多线程、同步块、线程安全、...
### 由生产者/消费者问题深入理解JAVA多线程 #### 生产者/消费者问题概述 生产者/消费者问题是一个经典的计算机科学问题,用于展示进程间的通信与同步问题。在这个模型中,生产者负责创建数据并将其放置到共享内存...
Java多线程生产者消费者模式实现过程解析 Java多线程生产者消费者模式是指在Java编程中,使用多线程来实现生产者和消费者之间的数据交换 и处理的模式。该模式下,生产者负责产生数据,而消费者负责处理数据。这种...