`

简单生产者-消费者

阅读更多
考虑一个场景:一个饭店有一个厨师和一个服务员。菜做好之后,厨师通知服务员端菜,服务员端完菜之后厨师才能做菜。

代码如下:



public class Meal {

 private final int orderNum;
  public Meal(int orderNum) {
  // TODO Auto-generated constructor stub
   this.orderNum=orderNum;
 }
  
  @Override
 public String toString() {
  // TODO Auto-generated method stub
  return "Meal "+orderNum;
 }
}


===================厨师类

public class Chef implements Runnable{

 private Restaurant restaurant;
 private int count=0;
 
 
 public Chef(Restaurant r) {
  // TODO Auto-generated constructor stub
  this.restaurant=r;
 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  try {
   while(!Thread.interrupted()){
    synchronized(this){
     while(restaurant.meal!=null){
      wait();
     }
     if(++count==100){
      System.out.println("Out of food ");
      restaurant.exec.shutdownNow();
     }
     System.out.println("Order up!");
     //++restaurant.num;
     //if(restaurant.num>1){
      //System.out.println("========>>>"+count);
     //}
     synchronized (restaurant.waitPerson) {
      restaurant.meal=new Meal(count);
      restaurant.waitPerson.notifyAll();
     }
     //TimeUnit.MILLISECONDS.sleep(100);
     
    }
    
   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   System.out.println("Chef interrupted!");
  }
  
 }
}

====================服务员类

public class WaitPerson implements Runnable{

 private Restaurant restaurant;
 
 public WaitPerson(Restaurant r) {
  // TODO Auto-generated constructor stub
  this.restaurant=r;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try {
   while(!Thread.interrupted()){
    synchronized(this){
     while(restaurant.meal==null)
      wait();
    }
    System.out.println("WaitPerson got "+restaurant.meal);
    //--restaurant.num;
    synchronized(restaurant.chef){
     restaurant.meal=null;
     restaurant.chef.notifyAll();
    }
   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   System.out.println("Wait Person interrupted.");
  }
 }
}

======================饭店类

public class Restaurant {
 // int num=0;
 Meal meal;
 ExecutorService exec=Executors.newCachedThreadPool();
 WaitPerson waitPerson=new WaitPerson(this);
 Chef chef=new Chef(this);
 public Restaurant() {
  // TODO Auto-generated constructor stub
  exec.execute(chef);
  exec.execute(waitPerson);
 }
 
 public static void main(String[] args){
  new Restaurant();
 }
 

}


分享到:
评论

相关推荐

    利用记录型信号量解决生产者-消费者问题.doc

    记录型信号量通常用于解决生产者-消费者问题,因为它可以记录缓冲池中的空缓冲区和满缓冲区的数量,从而实现生产者和消费者的同步。 解决生产者-消费者问题的方法 为了解决生产者-消费者问题,我们可以使用记录型...

    生产者-消费者模型模拟进程调度

    内含多个实验文档与可运行的代码 ...1. 生产者消费者对缓冲区进行互斥操作。 2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10次。

    生产者-消费者.zip

    生产者-消费者模式的核心思想是共享资源(通常是一个缓冲区)的分离,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行消费。这种模式利用了线程间的协作,实现了数据的生产和消费的解耦,并避免了...

    JAVA_生产者-消费者

    3. **示例代码**:一个简单的生产者-消费者模型可以通过创建一个固定大小的`ArrayBlockingQueue`实现。生产者线程不断地向队列中添加元素,直到队列满为止;消费者线程则不断从队列中取出元素,直到队列为空。每条...

    procon.rar_ProCon.d_生产 者- 消费者 问题_生产者

    以下是一个简单的生产者-消费者问题的解决方案概述: 1. 定义一个固定大小的缓冲区数组。 2. 初始化两个信号量:一个用于表示缓冲区的空位置数量(初始值等于缓冲区大小),另一个用于保护缓冲区(初始值为1)。 3....

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

    下面通过一个简单的例子来说明如何实现生产者-消费者模式: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { public static void main(String[] args) { // ...

    实验一 生产者消费者问题

    生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了保证系统的稳定性和正确性,...

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

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

    多线程间通信:多生产者-多消费者实例

    下面是一个简单的多生产者-多消费者示例: ```java import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; class Producer implements Runnable { private final ...

    并发控制-生产者-消费者问题

    - **多生产者-多消费者**:当有多个生产者和消费者时,问题变得更复杂,需要更高级的同步机制来确保公平性和效率。 - **优先级反转**:如果消费者线程的优先级高于生产者,可能会导致生产者被阻塞,影响整个系统的...

    java生产者-消费者

    生产者-消费者模式是多线程编程中的一种经典模式,它通过共享缓冲区来协调多个线程之间的交互:一组线程(生产者)负责向缓冲区添加数据,而另一组线程(消费者)则从缓冲区读取并处理这些数据。这种模式能够有效地...

    四川大学操作系统课程设计高分报告-第三次实验-生产者和消费者问题.doc

    这些API函数在解决生产者-消费者问题时起到了关键作用,它们帮助管理线程的并发行为,确保生产者不会在缓冲区满时继续生产,消费者也不会在缓冲区为空时尝试消费。通过适当的同步机制,可以避免竞争条件和其他并发...

    操作系统课程设计——模拟生产者与消费者(java)

    一、 课程设计目的 在多道程序环境下,进程同步问题十分重要,通过解决“生产者-消费者”问题,可以帮助我们更...为了使本系统以更加简单、直观的形式把“消费者-生产者”问题表现出来,我选择了使 用可视化界面编程。

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    以下是一个简单的生产者-消费者模式的C++实现: ```cpp #include #include #include #include std::queue<int> buffer; std::mutex mtx; std::condition_variable cv; const int MAX_BUFFER_SIZE = 5; void ...

    利用数组解决生产者消费者问题

    生产者消费者问题是多线程编程中的经典模型,用于模拟两个或多个并发执行的实体(生产者和消费者)共享有限资源的情况。在这个问题中,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行处理。当缓冲...

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

    4. ** 示例代码**:一个简单的生产者-消费者模型可以通过以下代码示例来理解: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { public static void main...

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

    1. **共享资源**:在生产者-消费者模型中,有一个共享的数据结构,通常是一个队列,用于存储生产者产生的产品。在Java中,可以使用 `ArrayBlockingQueue` 或 `LinkedBlockingQueue` 这样的并发容器来实现。 2. **...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    简单模拟生产者消费者

    通过改变生产者和消费者线程的数量,可以观察到不同情况下的并发行为,如生产者等待消费者或消费者等待生产者的情况。 总结来说,这个程序实现了基本的生产者-消费者模型,利用线程同步机制解决了资源的竞争问题,...

Global site tag (gtag.js) - Google Analytics