`
xly_971223
  • 浏览: 1277660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程之Producer-Consumer Pattern

    博客分类:
  • java
 
阅读更多
生产者/消费者模式
有两个厨师在做蛋糕(生产者)两个客人在吃蛋糕(消费者)
厨师做好了就放在桌子上,客人吃完了就从桌子上取,桌子实际上是共享队列
桌子最多能放3个蛋糕,放满了后厨师就等待 直到客人取走一个
整理后包括着几个类
MakerThread 厨师
EaterThread 客人
Table  共享队列
还有就是蛋糕了 我们用String来表示

package com.justel.fs.prod_cons;

import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 生产者
 * @author 徐良永
 * @date 2013-6-7下午1:17:06
 */
public class MakerThread extends Thread{
	private static AtomicInteger i = new AtomicInteger(0);
	private Table table;
	private Random random = new Random();
	public MakerThread(Table table, String name){
		super(name);
		this.table = table;
	}
	
	public void run(){
		try {
			while(true){
				String cake = "蛋糕"+i.getAndIncrement();
				table.put(cake);
				System.out.println(Thread.currentThread().getName() + "正在做:" + cake);
				Thread.sleep(random.nextInt(500));
			}
					
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

package com.justel.fs.prod_cons;

import java.util.Random;

/**
 * 消费者
 * @author 徐良永
 * @date 2013-6-7下午1:17:36
 */
public class EaterThread extends Thread{
	private Table table;
	Random random = new Random();
	
	public EaterThread(Table table, String name){
		super(name);
		this.table = table;
	}
	
	public void run(){
		try {
			while (true) {
				String cake = table.get();
				System.out.println(Thread.currentThread().getName() + "正在吃:" + cake);
				//random.nextInt(10000);1000
				Thread.sleep(10000);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

/**
 * 共享队列
 * @author 徐良永
 * @date 2013-6-7下午1:18:10
 */
public class Table {

	private LinkedList<String> linkedList = new LinkedList<>();
	
	public synchronized String get() throws InterruptedException{
		while (linkedList.isEmpty()) {
			wait(); //队列空了  所有消费线程转入等待状态
		}
		
		String s =  linkedList.removeFirst();
		notifyAll(); //通知所有生产线程---队列有空位了
		return s;
	}
	
	public synchronized void put(String s)throws InterruptedException{
		while(linkedList.size() >= 3){
			System.out.println("-----------桌子已经放满了------------");
			wait(); //队列满了 生产线程转为等待状态
		}
		
		linkedList.add(s);
		notifyAll(); //通知所有消费线程---队列有数据了
	}
}


public class Main {

	public static void main(String[] args) {
		Table table = new Table();
		
		for (int i = 0; i < 3; i++) {
			new EaterThread(table, "吃货" + i).start();
			new MakerThread(table, "厨师" + i).start();
		}
		
	}
}
分享到:
评论

相关推荐

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

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

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

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

    java多线程设计模式

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

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

    - **生产者-消费者模式(Producer-Consumer Pattern)**:如果滚动文字的生成和显示是异步的,这种模式可以确保生产者生成文字的速度与消费者(滚动显示)处理速度相匹配。 6. **异常处理**: - **多线程环境下,...

    Pattern-Oriented Software Architecture V2

    ### Pattern-Oriented Software Architecture V2 #### 书籍概述 《Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects, Volume 2》是一本深入探讨面向对象中间件设计模式的...

    剧场售票系统

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

    生成者消费者模式 代码

    ProducerConsumerPattern pattern = new ProducerConsumerPattern(); Thread producer = new Thread(() -&gt; pattern.produce()); Thread consumer = new Thread(() -&gt; pattern.consume()); producer.start(); ...

    java并发编程:设计与模式

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

    pc.zip_生产者 消费者_生产者与消费者_生产者消费者

    在IT领域,生产者-消费者模型(Producer-Consumer Pattern)是一种经典的多线程问题解决方案,主要应用于并发编程中。这个模型描述了两个角色——生产者和消费者,它们共享一个有限的资源池,生产者负责创建资源,而...

    java精典编程100例 5

    根据提供的信息,我们可以深入探讨Java经典编程中的一个关键概念——生产者消费者模式(Producer-Consumer Pattern)。这个模式在多线程编程中极为常见,并且是理解并发控制的基础之一。 ### 生产者消费者模式简介 ...

    consume_and_productor.rar_consume_生产者 消费者

    在IT行业中,生产者-消费者模型(Producer-Consumer Pattern)是一种经典的并发编程模型,用于解决多线程或分布式系统中的资源共享问题。该模型源于操作系统理论,被广泛应用于各种编程语言和框架中,如Java、C++、...

    Java.Concurrency.in.Practice.pdf

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

    良葛格DesignPattern学习笔记

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

    ConsoleApp11.rar

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

    Design patterns for concurent objects

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

    Java Monitor Pattern设计模式.docx

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

    教你用一行Python代码实现并行任务(附代码)

    Python在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和GIL,我...Standard Producer/Consumer Threading Pattern ''' import time import threading import Queue class Consumer(threading.

    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