2 qq 28015441 qq_28015441 于 2016.09.07 18:10 提问

一个简单的生产者与消费者问题

问题描述:有一个这样的饭店,他有一个厨师和服务员。这个服务员必须等待厨师准备好膳食。当厨师准备好时,他会通知服务员,之后服务员上菜,然后返回继续等待。
代码如下
package concurrency;

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

class Meal{

private final int id;

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

public String toString(){
    return "Meal: " + id;
}

}

class WaitMan implements Runnable{

private Restaurant restaurant;

public WaitMan(Restaurant restaurant){
    this.restaurant = restaurant;
}

public void run() {
    try {
        while (!Thread.interrupted()) {
            synchronized (this) {
                while (restaurant.meal == null) {
                    wait();
                }
            }
            System.out.println("Waitman got " + restaurant.meal);
            synchronized (restaurant.chef) {
                restaurant.meal = null;
                restaurant.chef.notifyAll();
            }
        }
    } catch (InterruptedException e) {
        System.out.println("WaitMan intettupted");
    }
}

}

class Chef implements Runnable{

private Restaurant restaurant;
private int count = 0;

public Chef(Restaurant restaurant){
    this.restaurant = restaurant;
}

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.exit(0);
        }
        System.out.println("Order up!");
        synchronized (restaurant.waitMan) {
            restaurant.meal = new Meal(count);
            restaurant.waitMan.notifyAll();
        }
        TimeUnit.MILLISECONDS.sleep(100);
    } catch (InterruptedException e) {
        System.out.println("Chef intettupted");
    }
}

}

public class Restaurant {
Meal meal;
WaitMan waitMan = new WaitMan(this);
Chef chef = new Chef(this);
ExecutorService exec = Executors.newCachedThreadPool();
public Restaurant(){
exec.execute(chef);
exec.execute(waitMan);
}
public static void main(String[] args) {
new Restaurant();
}

}
代码运行不出结果,貌似出现了死锁,求大神赐教

1个回答

jjxojm
jjxojm   2016.09.07 20:58
已采纳

Chef里面的while循环结束)的位置放错了吧,应该是

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.exit(0);
                      }
                        System.out.println("Order up!");
            synchronized (restaurant.waitMan) {
                restaurant.meal = new Meal(count);
                restaurant.waitMan.notifyAll();
            }
            TimeUnit.MILLISECONDS.sleep(100);
        }
    } catch (InterruptedException e) {
        System.out.println("Chef intettupted");
    }
}
qq_28015441
qq_28015441 还真是,没注意到
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
最简单的生产者/消费者问题
生产者/消费者问题。可以从下图中看到,有一个容器用来存放数据,我们可以把这个容器当作”交易场所“或者”仓库“,生产者只关心仓库是否存满,不需要关心消费者的情况。消费者也一样,不需要关心具体生产者的情况,具体有多少个生产者,只需要知道仓库中是否有数据,双方甚至都不知道对方的存在。 生产者消费者,是在多线程同步的一个问题,两个固定大小缓冲区的线程,在实际运行是会发生问题,生产者是生成数据放入缓冲区
生产者和消费者的简单例子
synchronizd可以作用于代码块和方法块上,现在编写一个生产者和消费者的简单例子。功能: 两个线程A,B。对同一个List进行操作。A写入数据,B读取数据。 A每次写入一个数据,就会通知B去读取。 B每次读取完,就将该数据从List中清除。 当List为空的时候,B会一直等待。 下面是详细代码:package com.test;import java.util.ArrayList; impor
windows编程实现生产者消费者问题
有四个生产者线程和四个消费者线程, 生产者线程的操作;当生产一个产品时,自己的生产区中画一个矩形区域,存入公共空间时,自己空间的矩形移动到公共空间。 消费者操作类似。 我遇到的问题就是:当程序执行到生产者线程创建的时候,程序不再执行回调函数, 下面是源代码:(这里面只是执行了生产操作,其他的尚未完成) //头文件header.h //在此文件中主要定义程序中所需要的图形界面的点的集
最简单的生产者消费者-pthread
最基本的生产者消费者模型: 一个生产者 一个消费者 一个BUFFER 一个锁 两个条件变量 /*pthread_cond_wait的大致操作流程: 解除已被调用线程锁住的锁 等待条件,睡眠阻塞 条件到来,醒来 返回前锁住解开的调用线程锁住的锁 pthread_cond_signal用于唤醒在某个条件变量上等待的线程,一般是1个pthread_cond_broadcast唤醒所有在某个条件
java简单小结(附一个java实现的生产者消费者问题的程序)
最近为了完成开发一个后台通过串口接收网络拓扑和传感数据,并显示网络拓扑和收到的数据的任务,又重新回顾下java。大学时代曾经学过这么课程。现在基本的任务完成了,来做一个自己关于java方面的一些总结吧。   1:java虚拟机。首先要理解java虚拟机。Java虚拟机是编译和运行Java程序等的各种命令及其运行环境的总称,这是比较正规的定义。我们可以把Java虚拟机理解为在操作系统提供的系统调
Java中简单的生产者和消费者问题
生产者和消费者问题描述:   仓库初始值为0, 生产者首先生产产品,生产产品后将产品放入仓库,仓库中产品数量变为1, 此时生产者不在生产产品,直到消费者进入仓库消费掉产品后,将仓库产品数量变为0,生产者才继续进行生产。 生产者和消费者问题分析:    仓库是生产者和消费者的公共资源,那么生产者和消费者可以分别看做是一个线程,有着共享资源。生产者和消费者共同访问仓库,但是仓库在同一时间只允许有一
简单的生产者消费者例子
继经典线程同步问题之后,我们来看看生产者消费者问题及读者写者问题。生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区
简单生产者消费者模型(java实现)
/** * Created by butter on 16-11-16. */ /** * * 生产者与消费者模型中,要保证以下几点: * 1 同一时间内只能有一个生产者生产 生产方法加锁sychronized * 2 同一时间内只能有一个消费者消费 消费方法加锁sychronized * 3 生产者生产的同时消费者不能消费 生产方法加锁sychr
进程、线程、生产者消费者问题
一周没有更新博客了,最近公司的事情有点忙,而且前面的知识感觉又开始生疏
c++多线程 (生产者消费者问题)
针对多线程中常见的生产者消费者问题,封装了一个类,和测试代码,方便日后直接套用。 具体来说就是多线程使用时候经常遇到的 一个线程取数据,一个处理数据,一个保存或传递数据。