`
yxx676229549
  • 浏览: 73883 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

生产者消费者,单单

 
阅读更多

package star20110712;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Restaurant {
	Meal meal;
	ExecutorService executorService = Executors.newCachedThreadPool();
	Waiter waiter = new Waiter(this);
	Chef chef = new Chef(this);
//	List<Waiter> waiters;
//	List<Chef> chefs;
	
	public Restaurant() {
//		waiters = new ArrayList<Waiter>();
//		chefs = new ArrayList<Chef>();
//		
//		for(int i= 0;i<5;i++){
//			Waiter waiter = new Waiter(this);
//			waiters.add(waiter);
//			Chef chef = new Chef(this);
//			chefs.add(chef);
//		}
		
		executorService.execute(waiter);
		executorService.execute(chef);
	}
	public static void main(String[] args) {
		new Restaurant();
	}
}

class Meal{
	//用final修饰,在多线程中,可以增加其值
	private final int orderNum;
	public Meal(int orderNum) {
		this.orderNum = orderNum;
	}
	@Override
	public String toString() {
		return "Meal:"+orderNum;
	}
}

class Waiter implements Runnable{
	private Restaurant restaurant;
	public Waiter(Restaurant restaurant) {
		this.restaurant = restaurant;
		}
	@Override
	public void run() {
		try {
			while(!Thread.interrupted()){
				synchronized(this){
					while(restaurant.meal == null){
						wait();
					}
				}
				System.out.println("Waiter got:"+restaurant.meal);
				synchronized (restaurant.chef) {
					restaurant.meal = null;
//					restaurant.chef.notifyAll();
					restaurant.chef.notify();
				}
			}
		} catch (InterruptedException e) {
			System.out.println("服务员终止");
		}
	}
}


class Chef implements Runnable{
	private Restaurant restaurant;
	private int count = 0;
	public Chef(Restaurant restaurant) {
		this.restaurant = restaurant;
	}
	@Override
	public void run() {
		try {
			while(!Thread.interrupted()){
				synchronized(this){
					while(restaurant.meal != null){
						wait();
					}
				}
				System.out.println("开始销售了第"+count+"个");
				if(++count == 10){
					System.out.println("销售完了");
					restaurant.executorService.shutdownNow();
				}
				synchronized(restaurant.waiter){
					restaurant.meal = new Meal(count);
//					restaurant.waiter.notifyAll();
					restaurant.waiter.notify();
				}
				TimeUnit.SECONDS.sleep(1);
			}
		} catch (InterruptedException e) {
			System.out.println("厨师终止");
		}
	}
	
}

 只是单消费者,单供应者。思考多消费者时,每一位消费者,相当于每一位服务员,那么一个服务员是不是考虑一个线程?

那么在唤醒的时候使用NotifyAll(),为什么API里没有Executors执行一个Runnable数组呢,或者list。

分享到:
评论

相关推荐

    生产者消费者问题

    生产者消费者问题解决方案 生产者消费者问题是计算机科学中的一种经典问题,描述的是在多线程环境中,多个生产者线程和消费者线程之间的协作问题。生产者线程负责生产数据,并将其存储在缓冲区中,而消费者线程则从...

    多生产者与多消费者问题c++源码

    多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多...

    生产者 消费者 模式 c++

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...

    labview 生产者消费者例子

    7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...

    生产者消费者问题 MFC 实现

    在计算机科学中,"生产者消费者问题"是一个经典的并发编程模型,用于展示如何在多线程环境下有效地管理和共享资源。MFC(Microsoft Foundation Classes)是微软提供的一种C++库,用于构建Windows应用程序,它提供了...

    生产者消费者的c++代码实现

    "生产者消费者问题C++代码实现" 生产者消费者问题是一个经典的进程同步问题,该问题最早由 Dijkstra 提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品...

    生产者与消费者实验报告

    ### 生产者与消费者实验报告知识点详述 #### 一、引言 在计算机科学领域,生产者与消费者模型是一种经典的同步机制,被广泛应用于多线程编程、操作系统设计以及分布式系统架构中。该模型主要解决的是多个进程或...

    生产者消费者问题c++实现

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的同步和异步操作。在C++中,我们可以利用标准库中的互斥量(mutex)、条件变量(condition_variable)等工具来实现这个问题...

    生产者消费者问题,MFC实现

    生产者消费者问题是多线程编程中的经典模型,用于展示如何高效地在多个线程之间共享资源。MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的C++库,用于构建Windows应用程序。在这个问题中,我们将...

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

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

    线程问题生产者消费者流程图

    生产者消费者流程图; 生产者消费者流程图。

    生产者消费者架构的串口高速数据采集.rar_greatervgw_labview_串口_串口 消费者_生产者消费者

    在IT领域,生产者消费者架构是一种常见的多线程或并发编程模型,用于高效地处理数据流。这个模型基于消息队列的概念,适用于各种环境,包括LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这样的...

    生产者消费者代码(C++版)

    在多线程编程中,"生产者-消费者"模型是一个经典的并发问题,它涉及到了如何在多个线程间共享资源并协同工作。本示例是使用C++实现的一个解决方案,结合了Posix信号量和互斥量来确保线程安全和同步。 生产者-消费者...

    生产者消费者程序的实现

    生产者消费者的实现。可以自主地改变生产者,消费者的数目,和缓冲区。

    pv操作解决生产者与消费者问题

    此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...

    生产者消费者问题C#

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

Global site tag (gtag.js) - Google Analytics