`

多线程模拟生产者消费者关系

阅读更多

在现实应用中,很多时候都需要让多个线程按照一定的次序来访问共享资源,例如,经典的生产者和消费者问题。

仓库中没有产品时,消费者要等待生产者生产产品;当仓库满时,生产者要等待消费者消费产品;在仓库中有产品但

未满时,消费者可以消费产品,生产者可以生产产品。可以采用循环检测的方法来实现,但是可以利用提供的wait(),

notify(),notifyAll()来更好的处理。

 

共享资源:

/**
 * 文件:Resoures.java
 * 描述:TODO
 * 作者:luckystar2008
 * 日期:2012-1-10
 */
package thread.product.customer.multiple;

/**
 * @author luckystar2008
 *
 */
public class Resoures {
	private char[] cArr = new char[5]; //模拟仓库,存放5个字符
	private int index = 0; //信号量,初始值为0
	
	public synchronized void push(char c) {
		if (index == cArr.length) { //仓库已满
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		cArr[index] = c;
		index++;
		notify();
	}
	
	public synchronized  char pop() {
		if (index == 0) { //仓库是空的,等待生产者生产产品
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		index--;
		notify();
		return cArr[index];
	}
}

 

生产者:

/**
 * 文件:Productor.java
 * 描述:模拟生产者
 * 作者:luckystar2008
 * 日期:2012-1-10
 */
package thread.product.customer.multiple;

/**
 * @author luckystar2008
 *
 */
public class Productor extends Thread{
	private Resoures r ;
	
	public Productor(Resoures r) {
		this.r = r;
	}
	
	public void run() {
		for (int i=0;i<5;i++) {
			char c = (char)(Math.random()*26+'A');
			System.out.println("Push element " + c);
			r.push(c);
			try {
				Thread.sleep((long)Math.random()*3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

 

模拟消费者:

/**
 * 文件:Consumer.java
 * 描述:模拟消费者
 * 作者:luckystar2008
 * 日期:2012-1-10
 */
package thread.product.customer.multiple;

/**
 * @author luckystar2008
 *
 */
public class Consumer extends Thread{
	private Resoures r;
	
	public Consumer(Resoures r) {
		this.r =r ;
	}
	
	public void run() {
		for (int i=0;i<5;i++) {
			char c = r.pop();
			System.out.println("Pop element " + c);
			try {
				Thread.sleep((long)Math.random()*3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

 

测试:

/**
 * 文件:Test.java
 * 描述:测试
 * 作者:luckystar2008
 * 日期:2012-1-10
 */
package thread.product.customer.multiple;

/**
 * @author luckystar2008
 * 生产者和消费者可以同时生产或消费多个产品。
 */
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Resoures r = new Resoures();
		Productor p = new Productor(r);
		Consumer c = new Consumer(r);

		c.start();
		p.start();
	}

}

 

 

 

分享到:
评论

相关推荐

    多线程模拟实现生产者/消费者模型

    生产者/消费者模型是多线程编程中的一个经典设计模式,它有效地利用了资源,避免了数据竞争和阻塞问题。这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    使用多线程程序模拟实现单生产者/多消费者问题(Linux下C语言)。

    使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...

    操作系统实验:多线程并发程序设计模拟生产者消费问题

    实验旨在让学生了解如何通过多线程并发编程来模拟生产者消费者问题,以及如何使用P-V操作(即信号量机制)来实现生产者和消费者的同步和互斥。P操作(Wait或Acquire)用于请求访问临界资源,而V操作(Signal或...

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

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

    .net 多线程 模拟生产者消费者(WindForm版)

    在.NET编程环境中,多线程技术是实现高性能和并发处理的关键。本文将深入探讨如何在Windows Forms...通过理解生产者消费者模式,并熟练掌握.NET提供的多线程工具,我们可以构建出满足高并发需求的WindForm应用程序。

    (Linux C)利用多进程或多线程模拟实现生产者/消费者问题

    以下是对"Linux C"环境下,利用多进程或多线程实现生产者/消费者问题的详细解释: 首先,我们需要了解基础概念: 1. **多进程**:在Linux系统中,每个进程都有自己的独立内存空间,它们之间的通信通常通过文件、...

    (Linux C)利用多进程或多线程模拟实现生产者/消费者问题。

    (Linux C)利用多进程或多线程模拟实现生产者/消费者问题。

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

    C++ 多线程 PV模拟生产者消费者模型多个实例

    "PV模拟生产者消费者模型"是多线程编程中的一个经典问题,它模拟了实际生产环境中的资源分配与消耗过程。在这个模型中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。为了保证生产者和消费者之间的协同工作...

    线程实现生产者消费者问题

    生产者消费者问题是多线程编程中的一个经典模型,用于演示如何在并发环境中通过共享资源进行协作。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。问题的关键在于如何保证生产者不会在无处...

    java模拟生产者和消费者问题

    尽管代码未完整展示逻辑部分,但可以看出其意图是通过按钮点击事件来模拟生产者生产数据和消费者消费数据的过程,从而可视化地演示阻塞和唤醒机制。 ### 总结 生产者-消费者问题不仅是并发编程的核心概念,也是...

    模拟生产者消费者程序

    在模拟生产者消费者程序中,我们可以使用P(等待)和V(信号)操作来控制生产者和消费者的动作。 标题“模拟生产者消费者程序”指的是我们将在一个没有依赖Windows API的环境中创建一个这样的程序。这意味着我们将...

    QT窗口界面模拟生产者消费者

    总结来说,"QT窗口界面模拟生产者消费者"是一个使用QT GUI和多线程技术实现的并发程序,通过子类化`QThread`、利用`QMutex`和`QWaitCondition`进行线程同步,模拟生产者-消费者问题。这个程序可以帮助开发者理解如何...

    生产者消费者问题C#

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的并发访问问题。在C#中,我们可以利用System.Threading命名空间提供的工具来实现这一模型。下面将详细阐述这个问题的背景、...

    操作系统课程设计——模拟生产者与消费者(java)

    模拟仿真“生产者-消费者”问题的解决过程及方法。 三、 系统分析与设计 1、 系统分析 在OS中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是在他们争用临界...

    用C语言模拟生产者消费者问题

    生产者消费者问题是多进程或线程同步的经典案例,它展示了如何在共享资源有限的情况下协调生产者和消费者的活动。在这个问题中,生产者负责生成产品,而消费者则负责消耗这些产品。为了解决这个问题,我们需要利用...

    C#窗体模拟生产者消费者问题.zip

    这个压缩包“C#窗体模拟生产者消费者问题.zip”很可能包含了一个C#应用程序,它通过Windows窗体界面展示了这个问题的实现。窗体可能是用来控制生产者和消费者的启动、停止以及显示当前缓冲区的状态。 生产者消费者...

    简单模拟生产者消费者

    生产者-消费者问题是一个经典的多线程同步问题,它源于操作系统设计中的并发概念。在这个问题中,有两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责生成产品并将其放入一个共享的有限大小的...

    linux下多线程模拟实验

    在这个"Linux下多线程模拟实验"中,我们将深入探讨如何使用C语言在Linux环境下实现生产者-消费者问题,这是一个经典的线程同步问题。 生产者-消费者问题是多线程编程中的一个经典案例,主要用于演示如何通过共享...

Global site tag (gtag.js) - Google Analytics