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

生产者与消费者例子(多线程wait()与notifyAll应用)

    博客分类:
  • JAVA
阅读更多
package test;

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

class Meal {
	private final int orderNum;

	public Meal(int orderNum) {
		this.orderNum = orderNum;
	}

	public String toString() {
		return "Meal " + orderNum;
	}
}
class WaitPerson implements Runnable{
	private Restaurant restaurant;
	public WaitPerson(Restaurant r){
		restaurant=r;
	}
	@Override
	public void run() {
		try {
			while(!Thread.interrupted()){
				synchronized (this) {
					while(restaurant.meal==null){
						wait();
					}
					
				}
				System.out.println("Waitperson got "+restaurant.meal);
				synchronized(restaurant.chef){
					restaurant.meal=null;
					restaurant.chef.notifyAll();
				}
			}
		} catch (InterruptedException e) {
			System.out.println("Waitperson interrupted");
		}
		
	}
	
}
class Chef implements Runnable{
	private Restaurant restaurant;
	private int count=0;
	public Chef(Restaurant r) {
		restaurant=r;
	}

	@Override
	public void run() {
		try {
			while(!Thread.interrupted()){
				synchronized (this) {//
					while(restaurant.meal!=null){
						wait();//
					}
				}
				if(++count==10){
					System.out.println("out of food, closing");
					restaurant.exec.shutdownNow();
				}
				System.out.print("Order up!");
				synchronized(restaurant.waitPerson){
					restaurant.meal=new Meal(count);
					restaurant.waitPerson.notifyAll();
				}
				TimeUnit.MILLISECONDS.sleep(100);
			}
		} catch (InterruptedException e) {
			System.out.println("Chef interrupted");
		}
		
	}
	
}
public class Restaurant {

	/**
	 * @param args
	 */
	Meal meal;
	ExecutorService exec=Executors.newCachedThreadPool();
	WaitPerson waitPerson=new WaitPerson(this);
	Chef chef=new Chef(this);
	public Restaurant(){
		exec.execute(chef);//启动chef线程
		exec.execute(waitPerson);//启动waitPerson线程
	}
	public static void main(String[] args) {
		new Restaurant();

	}

}

 

分享到:
评论

相关推荐

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

    9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...

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

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

    JAVA实现线程间同步与互斥生产者消费者问题

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    java多线程(生产者与消费者)

    总结来说,“java多线程(生产者与消费者)”是关于如何在Java中使用同步、线程间通信和共享资源来实现高效且安全的并发编程。通过理解并熟练应用这些概念和工具,开发者可以构建出能够充分利用多核处理器能力的高...

    java多线程实现生产者消费者关系

    在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...

    多线程_生产者与消费者模式示例

    在描述中提到的链接(),博主分享了一个关于多线程生产者与消费者模式的具体实现案例。虽然具体代码没有给出,但我们可以根据常见的实现方式来解析这个模式。 1. **共享数据结构**:在这个模式中,通常会有一个...

    多线程中的生产者与消费者问题

    ### 多线程中的生产者与消费者问题 在计算机科学领域,特别是在并发编程中,“生产者-消费者”问题是一个经典的同步问题。这个问题的核心是解决如何有效地管理一组生产者(负责生成数据或资源)和一组消费者(负责...

    生产者消费者源码(多线程)

    在计算机科学中,"生产者消费者模型"是多线程编程的一个经典案例,它展示了如何通过线程间的协作来管理共享资源。这个模型通常用于处理数据流,其中一个或多个线程(生产者)生成数据,然后将其放入一个缓冲区,而...

    生产者与消费者 java实现

    生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...

    java多线程_消费者与生产者模型

    在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境...总之,消费者-生产者模型是Java多线程编程中的一个重要概念,掌握其原理和实现对于构建高效、可靠的多线程应用程序至关重要。

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

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

    操作系统生产者与消费者问题Java简单模拟实现

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

    用多线程同步方法解决生产者-消费者问题

    在IT领域,多线程同步方法是解决并发编程中一种常见的问题,特别是在分布式系统和并发应用程序中。生产者-消费者问题是这种并发模型的一个经典案例,它涉及到如何在多个线程间共享资源,确保数据的一致性和正确性。...

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

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

    Java生产者与消费者

    在Java编程中,"生产者与消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的核心思想是通过共享一个有限的缓冲区,使得生产者线程可以将产品放入缓冲区,而消费者线程则可以从缓冲区取出...

    java生产者与消费者问题

    生产者与消费者问题是多线程编程中的一个经典问题,它主要涉及到线程间的协作与同步。在Java中,我们可以利用其内置的并发工具类来解决这个问题。本篇将深入探讨如何使用Java实现生产者和消费者的模型,并通过具体的...

    通过多线程解决生产者,消费者问题.pdf

    在探讨多线程编程时,经常会提及生产者与消费者问题,这是计算机科学中的经典问题,描述了两个或多个线程或进程如何协调以共享资源。生产者和消费者问题的目的是确保生产者不会在缓冲区满时向其添加数据,同时确保...

    java线程安全以及生产者消费者demo

    Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...

    生产者与消费者 java线程

    “生产者与消费者”模式是一种经典的多线程编程模型,在Java语言中有着广泛的应用。此模式通过一个共享队列或缓冲区来解耦生产者和消费者,使得生产者可以独立地将消息添加到队列中而不会阻塞等待,同时消费者可以...

Global site tag (gtag.js) - Google Analytics