`

简单生产消费者问题

阅读更多

生产者-消费者问题

a.       在多线程程序中,可能出现生产者-消费者问题,即等待同步数据的问题



 

 

 

b.        可能出现的问题:

     a)         生产者比消费者快时,消费者会漏掉一些数据没有取到

     b)        消费者比生产者快时,消费者取相同的数据

c.       notify()wait()方法用来协调读取的关系

d.       notify()wait()都只能从同步方法中调用

 

实例:

产品:

package com.bijian.thread;

public class Shared {
	private char c = '\u0000';

	void setSharedChar(char c) {
		this.c = c;
	}

	char getSharedChar() {
		return c;
	}
}

  

生产者:

package com.bijian.thread;

public class Producer extends Thread {

	private Shared s;

	Producer(Shared s) {
		this.s = s;
	}

	public void run() {
		for (char ch = 'A'; ch <= 'Z'; ch++) {
			try {
				Thread.sleep((int) (Math.random() * 4000));
			} catch (InterruptedException e) {
			}
			s.setSharedChar(ch);
			System.out.println(ch + " produced by producer.");
		}
	}	
}

 

 

消费者:

package com.bijian.thread;

public class Consumer extends Thread {

	private Shared s;

	Consumer(Shared s) {
		this.s = s;
	}

	public void run() {
		char ch;
		do {
			try {
				Thread.sleep((int) (Math.random() * 4000));
			} catch (InterruptedException e) {
			}
			ch = s.getSharedChar();
			System.out.println(ch + " consumed by consumer.");
		} while (ch != 'Z');
	}
}

 

 

主线程类:

package com.bijian.thread;

public class ProdCons {

	public static void main(String[] args) {
		Shared s = new Shared();
		new Producer(s).start();
		new Consumer(s).start();
	}
}

 

运行结果:
A produced by producer.
A consumed by consumer.
B produced by producer.
B consumed by consumer.
B consumed by consumer.
C produced by producer.
C consumed by consumer.
C consumed by consumer.
C consumed by consumer.
D produced by producer.
…

 

上面是一种运行结果,出现了消费者比生产者快,消费者取相同的数据C的问题。

为解决此问题,修改Shared类如下(方法增加同步锁,且增加writeable域变量控制放一个值、取一个值,再放下一个值、取下一个值的,,整个过程)

package com.bijian.thread;

public class Shared {

	private char c = '\u0000';
	private boolean writeable = true;

	synchronized void setSharedChar(char c) {
		if (!writeable)
			try {
				wait();
			} catch (InterruptedException e) {
			}
		this.c = c;
		writeable = false;
		System.out.println(Thread.currentThread().getName() + ": " + c + " produced by producer.");
		notify();
	}

	synchronized char getSharedChar() {
		if (writeable)
			try {
				wait();
			} catch (InterruptedException e) {
			}
		writeable = true;
		notify();
		System.out.println(Thread.currentThread().getName() + ": " + c + " consumed by consumer.");
		return c;
	}
}
运行结果:
Thread-0: A produced by producer.
Thread-1: A consumed by consumer.
Thread-0: B produced by producer.
Thread-1: B consumed by consumer.
Thread-0: C produced by producer.
Thread-1: C consumed by consumer.
Thread-0: D produced by producer.
Thread-1: D consumed by consumer.
… 
  • 大小: 16.1 KB
分享到:
评论

相关推荐

    实验一 生产者消费者问题

    生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了保证系统的稳定性和正确性,...

    利用数组解决生产者消费者问题

    生产者消费者问题是多线程编程中的经典模型,用于模拟两个或多个并发执行的实体(生产者和消费者)共享有限资源的情况。在这个问题中,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行处理。当缓冲...

    利用记录型信号量解决生产者-消费者问题.doc

    解决生产者-消费者问题的记录型信号量方法是一种简单而有效的解决方案。通过使用记录型信号量,我们可以实现生产者和消费者的同步,从而确保数据的正确性和完整性。这一方法广泛应用于操作系统、数据库系统和其他...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    利用管程_信号量解决生产者消费者问题

    ### 利用管程与信号量解决生产者消费者问题 #### 概述 生产者-消费者问题是计算机科学中一个经典的问题,它用于演示进程间通信和同步的基本概念。该问题通常涉及一组生产者进程(负责生成数据)和一组消费者进程...

    操作系统生产者与消费者问题Java简单模拟实现

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

    java 生产者消费者问题(源码)

    以下是一个简单的Java生产者消费者问题的实现: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerProblem { public static void main(String[] args) { BlockingQueue...

    生产者消费者问题.c

    操作系统课程生产者消费者问题模拟程序,程序相对简单,通过这个模拟程序能够帮助学习者会更好的学习os,供有需要的人学习使用。

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    四川大学操作系统课程设计高分报告-第三次实验-生产者和消费者问题.doc

    实验报告的标题揭示了本次操作系统课程设计的主题——“生产者和消费者问题”,这是一个经典的问题,常见于多线程编程和并发控制的学习中。该问题旨在模拟一个系统,其中多个生产者线程生产产品,而多个消费者线程...

    生产者消费者问题java

    下面是一个简单的生产者消费者问题的Java实现: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerProblem { public static void main(String[] args) { ...

    生产者消费者实验报告.doc

    实验报告涉及的是操作系统中的经典问题——生产者-消费者问题,这是一个多线程并发控制的经典案例。在这个实验中,主要目标是通过Java编程实现基于信号量机制的进程(线程)同步和互斥,以模拟生产者和消费者如何...

    生产者与消费者问题

    生产者与消费者问题是一个经典的多线程同步问题,在计算机科学特别是并发编程领域有着重要的地位。这个问题的核心在于如何在多个线程之间有效地共享资源,确保生产者(生成数据的线程)能够将数据安全地放入缓冲区,...

    MFC生产者消费者问题模拟

    在计算机科学中,"生产者消费者问题"是一个经典的多线程同步问题,它涉及到了并发控制和资源管理。MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序,包括图形用户界面(GUI)。...

    生产者与消费者问题(C++)

    在提供的C++代码中,作者实现了一个简单的生产者与消费者问题模型。下面将对代码进行详细分析。 #### 代码结构 首先,通过`#include&lt;iostream.h&gt;`引入了必要的输入输出库。虽然这个头文件已经被废弃,但在这里它...

    java生产者与消费者问题

    生产者与消费者问题是多线程编程中的一个经典问题,它主要涉及到线程间的协作与同步。在Java中,我们可以利用其内置的并发工具类来解决这个问题。本篇将深入探讨如何使用Java实现生产者和消费者的模型,并通过具体的...

    操作系统课设-生产者消费者问题.zip

    生产消费者问题是操作系统设计中经常遇到的问题。多个生产者和消费者线程访问在共享内存中的环形缓冲。生产者生产产品并将它放入环形缓冲,同时消费者从缓冲中取出产品并消费。当缓冲区满时生产者阻塞并且当缓冲区...

    生产者与消费者 java实现

    生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...

    生产者与消费者实验报告

    3. **能够在多线程环境下实现简单的生产者与消费者模型,并对其性能进行分析**。 4. **学会分析和解决在多线程编程中常见的问题,如死锁、饥饿等**。 #### 四、实验环境与工具 - **操作系统**:Windows/Linux/Unix...

    C#写的生产者消费者问题

    生产者消费者问题是多线程编程中的经典模型,用于展示如何有效地在并发环境下共享资源。这个问题源于现实世界的仓库模型,其中生产者负责生产商品,而消费者则负责消费这些商品。仓库作为一个缓冲区,存储有限的商品...

Global site tag (gtag.js) - Google Analytics