生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。
一,首先定义公共资源类,其中的变量number是保存的公共数据。并且定义两个方法,增加number的值和减少number的值。由于多线程的原因,必须加上synchronized关键字,注意while判断的条件。
/**
* 公共资源类
*/
public class PublicResource {
private int number = 0;
/**
* 增加公共资源
*/
public synchronized void increace() {
while (number != 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number++;
System.out.println(number);
notify();
}
/**
* 减少公共资源
*/
public synchronized void decreace() {
while (number == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number--;
System.out.println(number);
notify();
}
}
二,分别定义生产者线程和消费者线程,并模拟多次生产和消费,即增加和减少公共资源的number值
/**
* 生产者线程,负责生产公共资源
*/
public class ProducerThread implements Runnable {
private PublicResource resource;
public ProducerThread(PublicResource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.increace();
}
}
}
/**
* 消费者线程,负责消费公共资源
*/
public class ConsumerThread implements Runnable {
private PublicResource resource;
public ConsumerThread(PublicResource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.decreace();
}
}
}
三,模拟多个生产者和消费者操作公共资源的情形,结果须保证是在允许的范围内。
public class ProducerConsumerTest {
public static void main(String[] args) {
PublicResource resource = new PublicResource();
new Thread(new ProducerThread(resource)).start();
new Thread(new ConsumerThread(resource)).start();
new Thread(new ProducerThread(resource)).start();
new Thread(new ConsumerThread(resource)).start();
new Thread(new ProducerThread(resource)).start();
new Thread(new ConsumerThread(resource)).start();
}
}
分享到:
相关推荐
### 编程模拟实现生产者-消费者进程 #### 生产者-消费者问题概述 生产者-消费者问题是操作系统中进程间通信的经典案例之一。该问题主要描述了一组生产者进程不断生成数据并将其放置在一个共享缓冲区中,而一组消费...
首先,我们要理解生产者-消费者模型的基本概念。在这个模型中,“生产者”线程负责生成产品并放入“仓库”,而“消费者”线程则负责从仓库中取出产品并进行消费。为了保证数据的一致性和避免竞态条件(多个线程同时...
生产者-消费者模型在 Java 中的实现 在计算机操作系统中,生产者-消费者模型是一种常见的同步机制,用于解决多线程之间的数据共享和访问问题。在 Java 中,我们可以使用多线程编程和同步机制来实现生产者-消费者...
Java中的`java.util.concurrent`包提供了`BlockingQueue`接口,可以方便地实现生产者-消费者模型。生产者将产品放入队列,消费者从队列中取出产品,队列的大小限制了可以同时存储的产品数量,从而实现自动同步。 5...
`BlockingQueue`接口提供了线程安全的队列,自动处理了等待和唤醒操作,是实现生产者-消费者模型的一种高效方式。 4. **条件变量**:`wait()`, `notify()`和`notifyAll()`是基于条件变量的,它们可以使得线程在特定...
3. **示例代码**:一个简单的生产者-消费者模型可以通过创建一个固定大小的`ArrayBlockingQueue`实现。生产者线程不断地向队列中添加元素,直到队列满为止;消费者线程则不断从队列中取出元素,直到队列为空。每条...
在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者的模型。其中,`BlockingQueue`接口是一个重要的组成部分,它提供了线程安全的队列操作,支持阻塞的插入(put)和删除(take)操作,...
3. **生产者消费者模型的实现步骤**: - 创建一个阻塞队列作为共享数据结构。 - 生产者线程负责向队列中添加元素,当队列满时,调用`put()`方法会阻塞生产者。 - 消费者线程负责从队列中移除元素,当队列空时,...
生产者-消费者模型涉及到两个主要角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据或产品,并将其放入一个共享的缓冲区;而消费者则从这个缓冲区中取出并消费这些数据或产品。在我们的例子中,有...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
生产者-消费者问题是这种并发模型的一个经典案例,它涉及到如何在多个线程间共享资源,确保数据的一致性和正确性。在这个场景中,生产者线程负责生成数据并放入一个有限的缓冲区,而消费者线程则负责从缓冲区取出...
例如,`BlockingQueue`接口提供了线程安全的队列,它可以自然地应用于生产者-消费者模型。`BlockingQueue`的`put()`方法用于生产者添加元素,如果队列已满,它会阻塞生产者线程,直到有空间可用。同样,`take()`方法...
在Java中实现生产者-消费者模型时,通常会用到`java.lang.Thread`类或`java.util.concurrent.ExecutorService`接口来创建和管理线程,同时利用`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法来实现...
Java中实现生产者消费者模型通常会用到以下关键概念和技术: 1. **阻塞队列(BlockingQueue)**:这是生产者消费者模型的核心组件,用于存储待消费的数据。Java的`java.util.concurrent`包提供了多种阻塞队列实现,...
在Java编程中,"生产者-消费者"模型是一种常见的多线程问题,它涉及到进程间的同步与通信。在这个模型中,生产者线程负责生成数据并放入缓冲区,而消费者线程则负责从缓冲区取出数据进行处理。这里的"车库"例子就是...
`Queue` 类实现了生产者-消费者模型的核心逻辑,它维护了一个消息列表作为共享缓冲区,并提供了 `produce()` 和 `consume()` 方法用于生产和消费消息。此外,该类还提供了一个 `getCount()` 方法用于返回当前队列中...
Java多线程中的生产者-消费者模式是一种典型的同步与协作模型,它用于解决在多线程环境下资源的有效利用和协调问题。在这个模式中,通常有两个角色:生产者和消费者。生产者负责创建产品,而消费者则负责消费这些...
线程池可以配合生产者消费者模式,例如通过提交任务到线程池来实现生产者,线程池中的工作线程充当消费者角色。 在使用生产者消费者模式时,需要注意以下几点: - **线程安全**:确保所有的操作都是线程安全的,...
Java中的生产者-消费者模型是一种经典的多线程问题解决方案,用于在并发环境中高效地处理共享资源。这个模型基于“生产者”线程负责创建或生产数据,而“消费者”线程则负责消耗这些数据。在Java中,我们可以利用...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...