生产者与消费者模型 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实现生产者消费者模型

在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满 的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产...
  • a352193394
  • a352193394
  • 2014年09月18日 23:28
  • 7198

【线程同步】java实现生产者消费者问题与线程中的wait与notify总结

JAVA解决线程模型有三种方式,只讲一种:   1、wait()和notify()
  • robert_lizhiqiang
  • robert_lizhiqiang
  • 2014年09月15日 14:41
  • 1115

java wait()/notify() 实现生产者消费者模式

java中的多线程会涉及到线程间通信,常见的线程通信方式,例如共享变量、管道流等,这里我们要实现生产者消费者模式,也需要涉及到线程通信,不过这里我们用到了java中的wait()、notify()方法...
  • u014039577
  • u014039577
  • 2016年08月18日 17:54
  • 1932

利用wait()和notify()实现生产者与消费者问题

生产者与消费者问题是并发编程里面的经典问题,下面用wait()和notify()来实现消费者线程和生产者线程的并发执行。    说之前先讲几个概念:    wait()与sleep()的区...
  • zcxwww
  • zcxwww
  • 2016年05月13日 11:42
  • 2307

面试题:用 wait-notify 写一段代码来解决生产者-消费者问题

public class ProductTest { public static void main(String[] args) { Clerk clerk ...
  • jyxmust
  • jyxmust
  • 2017年02月24日 10:31
  • 2063

Java学习之线程--死锁-生产者消费者模式

一、过多的同步会导致死锁 二、生产者消费者模式: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem...
  • haitaofeiyang
  • haitaofeiyang
  • 2015年03月08日 16:34
  • 2095

Java wait() notify()方法使用实例讲解

1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。   2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的mon...
  • lingzhm
  • lingzhm
  • 2015年04月08日 14:54
  • 21383

java中notify和wait实现操作系统pv操作(单一生产者消费者)

单一生产者和消费者的pv操作,就是生产一个,消费一个,不生成,你就不能消费。 看代码:p操作 package entity; //生产者 public class P { private S...
  • anLA_
  • anLA_
  • 2017年04月13日 10:30
  • 722

生产者与消费者 & wait()& notify()

package cn.test.thread; /* * 线程的通讯:一个线程完成了自己的任务,要通知另外一个线程去完成另外一个任务 * * 生产者与消费者 * *问题一:出现了线程安全...
  • AaronWang0920
  • AaronWang0920
  • 2015年08月28日 20:35
  • 322

生产者消费者模型你知道多少

进入正题之前先说点故事。从最开始学java的那里开始:我是从08年下半年开始学Java,在《我的六年程序之路》中提到了一些。当时比较简单,每天看尚学堂的视频(对于初学者而言看视频好一些。),然后写代码...
  • luohuacanyue
  • luohuacanyue
  • 2013年11月12日 08:07
  • 33549
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:生产者与消费者模型 wait() · notify() 方法的使用
举报原因:
原因补充:

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