`
Supanccy2013
  • 浏览: 220606 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程-Producer-consumer(生产者消费者模式)

阅读更多
   多线程中生产者消费者模式是非常重要的模式,如果之前的几个模式都通晓了,这个模式也就水到渠成了。废话少说,下面开始模拟.
模拟功能需要实现如下要求:
1,厨师(MakerThread)会做蛋糕(String)放在桌子(Table)上。
2,桌子太小,顶多可以放3个蛋糕。
3,桌上已经放满3个蛋糕,而厨师还要放上蛋糕的话,会等待到桌子上出现空间为止。
4,客人(EaterThread)会拿桌上的蛋糕吃。
5,桌上没有蛋糕时,客人又要拿蛋糕的话,会等待到蛋糕放到桌子上为止。

涉及的类有:

package ProduceConsumerPattern;
public class Table {
	private final String[] buffer;
	private int tail;//下一个put的地方
	private int head; //下一个take的地方
	private int count;//buffer内的蛋糕数
	public Table(int count){
		this.buffer = new String[count];//生成一个指定容量盛放蛋糕的容器
		this.head = 0;  //设置下一个放蛋糕的数组索引值
		this.tail = 0;  //设置下一个拿蛋糕的数组索引值
		this.count = 0; //设置容器内含有的蛋糕的数量
	}
	/*
	 * 放置蛋糕
	 */
	public synchronized void put(String cake)throws InterruptedException{
	  System.out.println(Thread.currentThread().getName() + "puts:" + cake);
	  while(count >= buffer.length){//如果容器上有大于等于3个蛋糕的话线程进入Table的线程等待区
		wait();
	  }
	  buffer[tail] = cake;//如果容器里没有满的话,把蛋糕放进容器里
	  tail = (tail+1) % buffer.length;
	  count++;//增加蛋糕的数量
	  notifyAll();
	}
	//获取蛋糕
	public synchronized String take() throws InterruptedException{
		while(count<=0){
			wait();
		}
		String cake = buffer[head];
		head = (head+1) % buffer.length;
		count--;
		notifyAll();
		System.out.println(Thread.currentThread().getName() + "takes:" + cake);
        return cake;
	}
}


package ProduceConsumerPattern;
import java.util.Random;
public class MakerThread extends Thread{
	private final Random random;
	private final Table table;
	private static int id = 0;//蛋糕的流水号(每个线程都一样)
	public MakerThread(String name,Table table,long seed){
		super(name);
		this.table = table;
		this.random = new Random(seed);
	}
	public void run(){
		try {
			while(true){
				Thread.sleep(random.nextInt(1000));
				String cake = "[Cake No."+ nextId() + "by " + getName();
				table.put(cake);
			}
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	public static synchronized int nextId(){
		return id++;
	}
}

package ProduceConsumerPattern;
import java.util.Random;
public class EaterThread extends Thread{
	private final Random random;
	private final Table table;
	public EaterThread(String name,Table table, long seed){
		super(name);
		this.table = table;
		this.random = new Random(seed);
	}
	public void run(){
		try {
			while(true){
				String cake = table.take();
				Thread.sleep(random.nextInt(1000));
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}


package ProduceConsumerPattern;
public class Main {
	public static void main(String[] args) {
		Table table = new Table(3);
		new MakerThread("MakerThread-1",table,31415).start();
		new MakerThread("MakerThread-2",table,92653).start();
		new MakerThread("MakerThread-3",table,58979).start();
		new EaterThread("EaterThread-1",table,32384).start();
		new EaterThread("MakerThread-2",table,62643).start();
		new EaterThread("EaterThread-3",table,38327).start();
	}
}



分享到:
评论

相关推荐

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

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

    Java多线程-生产者与消费者问题

    ### Java多线程-生产者与消费者问题 #### 一、生产者与消费者问题概览 **1.1 概要** 生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者...

    Java多线程 生产者-消费者模式

    总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...

    Consumer-Producer.rar_Java Consumer_java 生产者 消费者_producer java_互

    Java中的生产者-消费者模型是一种经典的多线程问题解决方案,用于在并发环境中高效地处理共享资源。这个模型基于“生产者”线程负责创建或生产数据,而“消费者”线程则负责消耗这些数据。在Java中,我们可以利用...

    Producer产生一个数字而Consumer消费这个数字.rar_java 多线程_producer.java_生产者消费者_

    在Java中,可以使用`java.util.concurrent`包提供的工具来实现生产者消费者模式。例如,`BlockingQueue`接口是一个理想的选择,它提供了线程安全的插入和移除操作,如`put()`(用于生产者添加元素)和`take()`(用于...

    java 多线程 生产者消费者模式

    Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...

    java多线程例子-生产者消费者

    在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...

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

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

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    生产者和消费者模式多线程

    生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...

    producer-java.rar_java 生产者 消费者_java 生产者消费者_producer.java_生产者 消费者

    该问题涉及两个角色:生产者(Producer)负责创建数据,而消费者(Consumer)负责消耗这些数据。在实际应用中,如数据库系统、消息队列等,生产者消费者模型有着广泛的应用。 生产者消费者问题的核心在于如何有效地...

    【IT十八掌徐培成】Java基础第08天-04.多线程-生产者-消费者.zip

    通过学习和实践"生产者-消费者"模型,开发者能够更好地理解和掌握Java多线程的精髓,为构建高并发、高效率的应用打下坚实的基础。在实际项目中,这种模型常被用于实现缓存管理、消息队列以及数据库连接池等场景。

    consumer-producer.rar_producer_consumer.c_生产者消费者问题

    通过理解并分析`producer_consumer.c`文件,我们可以学习到如何在多线程环境中有效地管理共享资源,并解决生产者消费者问题。这种知识对于理解和实现并发系统、操作系统设计以及网络编程等领域都至关重要。

    由生产者/消费者问题看JAVA多线程

    ### 由生产者/消费者问题深入理解JAVA多线程 #### 生产者/消费者问题概述 生产者/消费者问题是一个经典的计算机科学问题,用于展示进程间的通信与同步问题。在这个模型中,生产者负责创建数据并将其放置到共享内存...

    Producer/Consumer 多线程处理文件

    在这个"Producer/Consumer 多线程处理文件"的主题中,我们将深入探讨Java中的生产者消费者模型,以及如何利用这一模式来高效地处理大量数据,如一秒钟处理一千多条记录。 生产者消费者模型源于操作系统理论,是解决...

    生产者-消费者多线程处理

    生产者-消费者模型涉及到两个主要角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据或产品,并将其放入一个共享的缓冲区;而消费者则从这个缓冲区中取出并消费这些数据或产品。在我们的例子中,有...

    线程同步--生产者消费者问题

    在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...

    java 多线程生产者消费者模型demo

    Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...

    java多线程实现生产者和消费者

    在Java编程中,多线程是并发处理任务的关键机制,而生产者-消费者问题是多线程编程中的一个经典模型。这个模型描述了两个角色:生产者(Producer)负责创建资源,消费者(Consumer)则负责消耗这些资源。为了解决...

Global site tag (gtag.js) - Google Analytics