生产者与消费者模型 wait() · notify() 方法的使用

原创 2015年07月06日 17:58:35

模型说明:

Cooker生产食物, 把食物放到盘子中,如果盘子中没有食物就继续生产。
客户消费食物,如果盘子中有食物就把食物吃掉。

Object的wait() notify() 方法使用说明:
其中wait方法必须在 Object的 synchronized块中执行
这里写图片描述

public void make(){
        if(d.isEmpty()){
            int index = ran.nextInt(foods.length);
            String f = foods[index];
            System.out.println(name + "制作了"+f);
            d.setFood(f);
            d.setEmpty(false);
            //不能依赖于sleep来控制线程
            /*try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/
        }
    }

Cooker类

package produce;

import java.util.Random;

public class Cooker implements Runnable{
    private String name;
    private String[] foods;
    private Disk d;
    private static Random ran = new Random();

    public Cooker(String name, Disk d) {
        super();
        this.name = name;
        this.foods = new String[]{"大米","馒头","包子","豆沙包","鱼","牛肉"};
        this.d = d;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String[] getFoods() {
        return foods;
    }
    public void setFoods(String[] foods) {
        this.foods = foods;
    }
    public Disk getD() {
        return d;
    }
    public void setD(Disk d) {
        this.d = d;
    }

    public void make(){
        synchronized (d) {
            if(d.isEmpty()){
                int index = ran.nextInt(foods.length);
                String f = foods[index];
                System.out.println(name + "制作了"+f);
                d.setFood(f);
                d.setEmpty(false);
                d.notify();
                try {
                    d.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else{
                try {
                    d.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void run() {
        for(int i=0; i<20; i++){
            make();
        }
        d.setEnd(true);
    }

}

Customer 类

package produce;

public class Customer implements Runnable{
    private String name;
    private Disk d;
    public Customer(String name, Disk d) {
        super();
        this.name = name;
        this.d = d;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Disk getD() {
        return d;
    }
    public void setD(Disk d) {
        this.d = d;
    }

    public void eat(){
        synchronized (d) {
            if(!d.isEmpty()){
                String food = d.getFood();
                System.out.println(name + "正在享用"+food);
                d.setEmpty(true);
                d.notify();
                try {
                    d.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else{
                try {
                    d.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }
    @Override
    public void run() {
        while(true){
            if(d.isEnd()){
                break;
            }
            eat();
        }
    }
}

Disk 类

package produce;

public class Disk {
    private String food;
    private boolean empty;
    private boolean end;


    public Disk(boolean end) {
        super();
        this.end = end;
    }
    public String getFood() {
        return food;
    }
    public boolean isEnd() {
        return end;
    }
    public void setEnd(boolean end) {
        this.end = end;
    }
    public void setFood(String food) {
        this.food = food;
    }
    public boolean isEmpty() {
        return empty;
    }
    public void setEmpty(boolean empty) {
        this.empty = empty;
    }

}

Test 类

package produce;

public class Test {
    public static void main(String[] args) {
        Disk d = new Disk(false);
        d.setEmpty(true);
        Cooker co = new Cooker("刘大厨",d);
        Customer cu = new Customer("王小胖",d);

        new Thread(co).start();
        new Thread(cu).start();
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 ...

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 w...
  • wanglha
  • wanglha
  • 2015年08月10日 14:03
  • 237

ImportNew 首页所有文章资讯Web架构基础技术书籍教程我要投稿更多频道 » 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 w...

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wai...

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

看到了这篇文章,不知是我的理解错误啊,还是原作者写错了,我按照原作者写的写了个demo运行得到的结果和原作者就是不一样,自己思考了下,要想得到原作者所说的那种效果,必须要在达到所需条件后才去notif...

使用Object类中的wait()和notify()方法实现生产者和消费者模式

生产者消费者模式,在实际的开发过程中经常会遇到,平常我们接触到的例如ActiveMQ就是一个一个典型的生产者消费者模式。为了更好的理解生产者和消费这模式,下面通过自己定义的一个消息类、结合Object...

多线程执行多类型任务(线程通信wait/notify(notifyAll)):生产者消费者模型(一)

这里使用自增和自减来模拟生产者消费者模型。

线程通信(生产者消费者问题)、wait()与notify()方法详解

一、线程通信(生产者消费者问题): 1、线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务。 2、经典问题:生产者与消费者问题。 1)存在线程安全问题:可能出现价格错乱的...

Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”

想利用传统的线程通信wait(),notify(),notifyAll()方法,必须依赖于同步监听器的存在,也就是说,对于synchronized修饰的同步方法,因为该类的默认实例(this)就是同步...
  • HD1099
  • HD1099
  • 2015年08月05日 20:02
  • 677

java线程的wait方法和notify方法的运用(包含生产者消费者代码【已练习】)

source: http://blog.csdn.net/liranke/article/details/12222265 一. Java Thread类的几个函数的说明:  1.  ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:生产者与消费者模型 wait() · notify() 方法的使用
举报原因:
原因补充:

(最多只允许输入30个字)