生产者与消费者问题可以被描述为:一个有限缓冲区和两类线程,它们是生产者和消费者,生产者把产品放入缓冲区,相反消费者便是从缓冲区中拿走产品。
生产者在缓冲区满时必须等待,直到缓冲区有空间才继续生产。消费者在缓冲区空时必须等待,直到缓冲区中有产品才能继续读取。
下面用三个实例描述这个问题在线程级别上的Java实现。
1.单生产者-单消费者-单个资源
单个生产者,单个消费者以及缓冲区大小为1(单个资源)的情况,类似于停等协议的实现。
生产者(SingleProducer):
[1]生产一个资源(Resource);
[2]notify潜在的等待着的消费者(SingleCostumer);
[3]wait直到资源被消费。
消费者(SingleCostumer):
[1]消费一个资源(Resource);
[2]notify潜在的等待着的生产者;
[3]wait直到资源被产生。
资源Resource.java
package com.zj.one;
public class Resource {
private final int resNum;
public Resource(int resNum) {
this.resNum = resNum;
}
public String toString() {
return "Resource " + resNum;
}
}
|
生产者SingleProducer.java
package com.zj.one;
import java.util.concurrent.TimeUnit;
public class SingleProducer implements Runnable {
private SinglePlatform platform;
private int count = 0;
public SingleProducer(SinglePlatform platform) {
this.platform = platform;
}
public void run() {
try {
while (!Thread.interrupted()) {
synchronized (this) {
while (platform.res != null)
wait(); // for the resource to be consumed
}
System.out.println("Producer add resource " + ++count);
synchronized (platform.customer) {
platform.res = new Resource(count);
platform.customer.notify();
}
TimeUnit.MILLISECONDS.sleep(100);
}
} catch (InterruptedException e) {
System.out.println("Producer interrupted");
}
}
}
|
消费者SingleCustomer.java
package com.zj.one;
public class SingleCustomer implements Runnable {
private SinglePlatform platform;
public SingleCustomer(SinglePlatform platform) {
this.platform = platform;
}
public void run() {
try {
while (!Thread.interrupted()) {
synchronized (this) {
while (platform.res == null)
wait(); // ... for the productor to produce
}
System.out.println("Customer got " + platform.res);
synchronized (platform.productor) {
platform.res = null;
platform.productor.notify(); // Ready for another
}
}
} catch (InterruptedException e) {
System.out.println("Customer interrupted");
}
}
}
|
单个资源缓冲区SinglePlatform.java
package com.zj.one;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class SinglePlatform {
Resource res;
ExecutorService exec = Executors.newCachedThreadPool();
SingleProducer productor = new SingleProducer(this);
SingleCustomer customer = new SingleCustomer(this);
public void runPlatform() throws InterruptedException{
Future<?> f1=exec.submit(productor);
Future<?> f2=exec.submit(customer);
TimeUnit.SECONDS.sleep(3);
f1.cancel(true);
f2.cancel(true);
exec.shutdown();
}
public static void main(String[] args) throws InterruptedException {
new SinglePlatform().runPlatform();
}
}
|
每次启动程序后,在3秒钟后中断所有的线程,结束程序。
2.单生产者-单消费者-多个资源
当缓冲区长度大于1时,类似于滑动窗口协议。资源类Resource.java不变。缓冲区BufferPlatform.java中使用一个队列来实现滑动窗口。
这里设计两种策略来模拟生产速度快于和慢于消费速度两种情形。策略实现自一个策略接口RunnerStrategy。
生产者与消费者分别持有一个标志位来判断是否需要等待。在队列满时,生产者等待;在队列空时,消费者等待。
缓冲区BufferPlatform.java
package com.zj.two;
import java.util.AbstractQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import com.zj.three.Resource;
public class BufferPlatform {
AbstractQueue<Resource> res = new ConcurrentLinkedQueue<Resource>();
private int queueSize = 3;//窗口大小
ExecutorService exec = Executors.newCachedThreadPool();
RunnerStrategy runnerStrategy;
SingleProducer producer |
分享到:
相关推荐
"线程同步生产者消费者问题"是多线程编程中一个经典的示例,它涉及到资源的共享、线程间的协作以及等待条件的建立。以下是对这一问题的详细解析。 首先,我们需要了解"生产者消费者问题"的基本模型。在这个模型中,...
在生产者与消费者问题中,可以使用两个信号量分别控制生产者和消费者对缓冲区的操作。 - **互斥锁**:另一种常见的同步机制,用于确保同一时间只有一个进程能够访问临界资源。在本例中,可以使用互斥锁来防止生产者...
### 进程同步与互斥:生产者与消费者问题 #### 一、基础知识与概念解析 **1.1 操作系统的基本概念** 操作系统(Operating System, OS)是计算机系统的核心软件,负责管理和协调计算机硬件资源及软件资源。它通过...
### 生产者与消费者实验代码知识点解析 #### 一、实验背景与目的 生产者-消费者问题是一个经典的多线程同步问题,在计算机科学领域中,主要用于研究如何在多个线程之间进行协调工作的问题。该实验旨在通过编程实现...
生产者-消费者问题是多线程编程中的经典案例,它展示了如何在并发环境中实现线程间的同步与互斥。在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000环境下运行的控制台应用程序,通过多...
### 多进程同步解决生产者消费者问题(C++源码解析) #### 一、问题背景与定义 生产者-消费者问题是一种经典的并发编程问题,它最初由Edsger Dijkstra提出,用来展示信号量机制的应用场景。在这个问题中,存在两类...
生产者与消费者问题描述的是多个生产者向缓冲区写入数据,而多个消费者从中读取数据的情况。这里的挑战在于如何保证数据的完整性和一致性,即生产者不能在缓冲区满时继续写入数据,而消费者也不能在缓冲区空时尝试...
### 生产者与消费者问题详解及源代码分析 在计算机科学中,“生产者与消费者问题”(也称为“缓冲区问题”)是一个经典的同步问题,它涉及到多线程编程中的资源管理和调度。此问题通常用来阐述如何在共享资源上实现...
操作系统中的“生产者-消费者问题”是一个经典的多线程同步问题,它源于现实生活中的生产流水线,用于模拟两个或多个不同步操作之间的交互。在这个问题中,“生产者”负责生成资源(例如产品),而“消费者”则负责...
### 生产者消费者问题代码详解 #### 一、生产者消费者问题概述 生产者-消费者问题(Producer-Consumer Problem)是计算机科学中的一个经典进程同步问题。这个问题最早由荷兰计算机科学家Edsger W. Dijkstra在20...
### 多生产者多消费者问题源码解析 #### 一、引言 在并发编程领域,**生产者-消费者问题**是一种经典的同步问题,通常用来描述一组进程如何通过共享资源来协同工作。这类问题的核心在于如何确保不同角色的进程能够...
根据给定的文件信息,以下是对“操作系统实验生产者与消费者实验报告及代码”的详细解析: ### 一、实验背景与目的 本次实验基于Windows操作系统环境,通过利用其提供的API函数来实现进程间的互斥与同步机制。实验...
在深入探讨C++中的“生产者与消费者”模式之前,我们先来理解这一经典问题的背景及其在操作系统和多线程编程中的应用。生产者与消费者问题是计算机科学中用于研究同步问题的一个著名模型,最早由荷兰计算机科学家...
### 操作系统课程设计:生产者与消费者问题详解 #### 一、问题背景与意义 在计算机科学领域,特别是操作系统理论中,“生产者-消费者”问题是一个非常经典的进程同步问题。这一问题最早由著名的计算机科学家Edsger...
### 生产者消费者问题解析与实现 #### 一、生产者消费者问题简介 生产者消费者问题(Producer-Consumer Problem)是计算机科学中经典的同步问题之一,通常用来展示进程间通信和同步机制。该问题涉及两个类别的进程...
生产者消费者问题是计算机科学中的一个经典问题,主要用于描述并发环境下多个线程之间如何共享有限资源的问题。在这个问题中,“生产者”负责生成数据并将其放入公共缓冲区中,“消费者”则负责从缓冲区取出数据进行...
知识点:Java实现操作系统中的消费者生产者问题 一、消费者生产者问题概述 消费者生产者问题,也称为有界缓冲区问题,是并发编程中的经典问题,主要用来展示进程或线程之间的同步问题。该问题涉及两个类型的角色:...
### 编程实现生产者消费者或读写者的同步问题 #### 概述 本文将详细介绍如何通过编程方式解决生产者消费者问题,这是一个经典的多线程同步问题。在本例中,我们将采用C++语言结合Windows API来实现。该示例程序...
在实际应用中,生产者消费者模式可以解决耦合、并发和忙闲不均的问题。例如,在寄信的例子中,生产者(你)负责写信,消费者(邮递员)负责处理信件,邮筒则作为缓冲区,中介生产者和消费者。 该模式的优点包括: ...
Linux的生产者与消费者问题,有具体的案例,有详细的例题和解析,操作系统必考题