`
hanlu0221
  • 浏览: 14184 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

多线程设计模式之——Producer-Consumer Pattern

阅读更多
此模式是在生产者与消费者之间加入一个“桥梁参与者”来缓冲线程之间的处理速度差。一般可以存在多个生产者与消费者,但当双方都只有一个的时候,又称为Pipe Pattern。

例子:假设有2个生产者,2个消费者,仓库里只能放4个产品。(这里的产品就是String类型的名字而已)


//Storage.java
public class Storage {
	private String[] buffer;
	private int head;//取走一个商品的位置
	private int tail;//存入一个商品的位置
	private int count;//buffer内的商品数量
	
	public Storage(int count){
		this.buffer = new String[count];
		this.count = 0;
		this.head = 0;
		this.tail = 0;
	}
	
	//这里的if警戒条件就运用了Guarded Suspension Pattern,要求不满足条件,便等待
	public synchronized void put(String goods) throws InterruptedException{
		System.out.println(Thread.currentThread().getName() + " produce the goods:" + goods);
		if(count >= buffer.length){
			System.out.println("the storage is full!");
			wait();
		}
		buffer[tail] = goods;
		tail = (tail + 1) % buffer.length;
		count++;
		notifyAll();
	}
	
	public synchronized String get() throws InterruptedException{
		if(count <= 0){
			System.out.println("the storage is empty!");
			wait();
		}
		String goods = buffer[head];
		head = (head + 1) % buffer.length;
		count--;
		notifyAll();
		System.out.println(Thread.currentThread().getName() + " consume the goods:" + goods );
		return goods;
	}

}




//ProducerThread.java
import java.util.Random;


public class ProducerThread extends Thread {
	private Storage storage;
	private Random random;
	private static int pid;  //产品编号
	
	public ProducerThread(String name , Storage storage){
		super(name);
		this.storage = storage;
		this.random = new Random();
	}
	
	public void run(){
		try{
			for(int i=0; i<10; i++){
				Thread.sleep(random.nextInt(1000));//模拟生产时间
				String goods = getName() + " produce the goods" + nextPId();
				storage.put(goods);
			}
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
	
	private static synchronized int nextPId(){
		return pid++;
	}

}




//ConsumerThread.java
import java.util.Random;


public class ConsumerThread extends Thread {
	private Storage storage;
	private Random random;
	
	public ConsumerThread(String name , Storage storage){
		super(name);
		this.random = new Random();
		this.storage = storage;
	}
	
	public void run(){
		try{
			while(true){
				storage.get();
				Thread.sleep(random.nextInt(2000));//模拟商品使用时间
			}
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}

}




//Main.java
public class Main {

	public static void main(String[] args) {
		Storage storage = new Storage(4);
		new ProducerThread("producer_lulu01" , storage).start();
		new ProducerThread("producer_lulu02" , storage).start();
		new ConsumerThread("consumer_fang01" , storage).start();
		new ConsumerThread("consumer_fang02" , storage).start();
		

	}

}
分享到:
评论

相关推荐

    java多线程设计模式

    Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境中高效、安全地组织代码执行。在Java中,多线程是通过Thread类或实现Runnable接口来创建和管理的。本教程将深入探讨多线程设计模式,帮助...

    Threads-com-Produtor-Consumidor-em-JAVA:JAVA中Threads+Producer-Consumer的使用演示

    生产者-消费者模式(Producer-Consumer pattern)是多线程编程中的一个经典设计模式,用于解决资源共享问题。这个模式的核心思想是通过共享一个缓冲区来实现生产者和消费者之间的协作。在这个模式中,生产者负责生成...

    设计滚动字演示线程状态及改变方法

    综上所述,设计滚动字演示线程状态及改变方法涉及到了Java GUI编程、多线程控制、线程状态管理、动画效果实现以及设计模式等多个方面。理解并掌握这些知识点,能帮助我们构建出高效、稳定的滚动文字展示系统。

    C++类中创建多线程实现本地和远程打印

    10. **设计模式**:为了提高代码的可读性和可维护性,可能会应用一些设计模式,如生产者-消费者模型(Producer-Consumer Pattern)来处理队列中的任务,或者单例模式(Singleton Pattern)来确保类的全局唯一性。...

    Pattern-Oriented Software Architecture V2

    《Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects, Volume 2》是一本深入探讨面向对象中间件设计模式的专业书籍。本书由四位作者共同编写:Douglas Schmidt、Michael Stal...

    剧场售票系统

    最后,为了保证系统的可扩展性和灵活性,开发者可能还会采用**设计模式**,如生产者-消费者模式(Producer-Consumer Pattern)来协调售票窗口(生产者)和票的库存(消费者)之间的交互。这种模式可以帮助抽象出并发...

    java并发编程:设计与模式

    此外,生产者-消费者模式(Producer-Consumer Pattern)在并发编程中也非常重要,它的应用场景广泛,可以帮助开发者在多线程之间协调工作和资源的分配。 Java并发编程还涉及到线程池的设计。线程池管理一组工作线程...

    Java Monitor Pattern设计模式.docx

    Java Monitor Pattern设计模式是用于解决多线程环境下的并发访问问题的一种经典设计模式。它基于监视器对象(Monitor Object)的概念,确保在任一时间点只有一个线程能够访问特定的共享资源,从而实现线程安全。 **...

    生成者消费者模式 代码

    生成者消费者模式是一种经典的多线程设计模式,它在并发编程中被广泛应用,尤其是在资源有限、需要高效利用系统资源的场景下。这个模式的核心思想是通过协调生产者和消费者线程,使得生产者不直接向消费者提供产品,...

    java精典编程100例 5

    生产者消费者模式是一种经典的多线程设计模式,用于解决多线程间的数据共享问题。它将任务分为两个部分:**生产者**负责创建数据,而**消费者**则负责处理这些数据。这种分工明确的设计可以提高程序的效率和响应能力...

    Design patterns for concurent objects

    **生产者-消费者模式(Producer-Consumer Pattern):** 这是一种经典的并发模式,用于处理生产者和消费者之间的数据交换问题。在这种模式下,生产者负责创建数据并将其放入队列,而消费者则从队列中取出数据进行...

    良葛格DesignPattern学习笔记

    良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...

    ConsoleApp11.rar

    在这种背景下,生产者-消费者模式(Producer-Consumer Pattern)是一种非常有效的设计模式,用于协调并发任务,使得数据的生产和消费能够高效、有序地进行。本文将深入探讨该模式在.NET 6中的实现,以及如何利用`...

    Java.Concurrency.in.Practice.pdf

    并发集合(Synchronized Collections)、并发集合(Concurrent Collections)、阻塞队列(Blocking Queues)以及生产者-消费者模式(Producer-Consumer Pattern)是构建并发程序的基石。 4. **同步器...

    Multi-Threaded-Restaurant

    《多线程餐厅模拟系统——基于Java的实现》 在计算机科学中,多线程编程是一种重要的技术,它允许多个任务在同一时间并行执行,从而提高系统的效率和响应速度。本项目“Multi-Threaded-Restaurant”就是这样一个...

    Messaging

    5. **设计模式**:消息传递系统可能使用观察者模式(Observer Pattern),让接收者订阅消息并接收通知,或者使用生产者-消费者模式(Producer-Consumer Pattern)来处理消息队列。 6. **错误处理与异常安全**:网络...

    ConsumidorProdutorPipe:ConsumerProdutorPipe

    "消费者-生产者模型"(Consumer-Producer Pattern)是计算机科学中的一个经典设计模式,尤其在多线程编程中被广泛应用。这个模式主要用于解决资源的同步访问问题,确保生产者和消费者之间的协作有序进行,避免数据...

Global site tag (gtag.js) - Google Analytics