java wait/notify 生产者消费模式
2016-09-12 22:20
471 查看
本程序模拟了 一个厨师生产 两个吃货消费的场景
/*** Date:2016年9月7日下午7:56:03* Copyright (c) 2016, www.bwbroad.com All Rights Reserved.**/package test.wait;import java.util.LinkedList;import java.util.Queue;import java.util.Random;/*** Description: TODO <br/>* Date: 2016年9月7日 下午7:56:03 <br/>** @author xuejianxin*/public class WaitTest2 {public static int CHUSHI=6;public static int CHIHUO=10;public static void main(String[] args) throws Exception {System.out.println(new Random().nextInt(10));Panzi panzi = new Panzi(2);Chushi chushi = new Chushi("厨师", panzi);chushi.start();Chushi chushi1 = new Chushi("厨师1", panzi);chushi1.start();Chihuo chihuo1 = new Chihuo("吃货1", panzi);Chihuo chihuo2 = new Chihuo("吃货2", panzi);chihuo1.start();chihuo2.start();}public static class Panzi {private int count = 0;private Queue<String> foods;public Panzi(int count) {this.count = count;foods = new LinkedList<String>();}public synchronized void put(String name,String food) {while (foods.size() >= count) {//满了, 这里必须用循环System.out.printf("%d/%d,%s 快吃啊...........................\r\n",foods.size(),this.count,name);try {this.wait();//为什么是 this.wait 是盘子在 wait 吗?????} catch (InterruptedException e) {e.printStackTrace();}}foods.offer(food);System.out.printf("%d/%d,%s----->%s\r\n",foods.size(),this.count,name,food);this.notifyAll();}public synchronized String get(String name) {while (foods.size() == 0) {//这里必须用循环System.out.printf("%d/%d,%s 我等待花儿都谢了...\r\n",foods.size(),this.count,name);try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}String food = foods.poll();System.out.printf("%d/%d,%s******>%s\r\n",foods.size(),this.count,name,food);this.notifyAll();return food;}}// 厨师类public static class Chushi extends Thread {private Panzi panzi;private String name;public Chushi(String name, Panzi panzi) {this.name = name;this.panzi = panzi;}@Overridepublic void run() {int i = 1;String s;while (true) {s = "food" + (i++);//生产一个panzi.put(this.name,s);i++;try {Thread.sleep(new Random().nextInt(CHUSHI)*100);} catch (InterruptedException e) {e.printStackTrace();}}}}// 吃货类public static class Chihuo extends Thread {private String name;private Panzi panzi;public Chihuo(String name, Panzi panzi) {this.name = name;this.panzi = panzi;}@Overridepublic void run() {while (true) {panzi.get(this.name);try {Thread.sleep(new Random().nextInt(CHIHUO)*100);} catch (InterruptedException e) {e.printStackTrace();}}}}}
相关文章推荐
- Java中通过wait和notify来实现生产者和消费者模式
- java多线程15 :wait()和notify() 的生产者/消费者模式
- JAVA并发实现五(生产者和消费者模式wait和notify方式实现)
- Java多线程——使用wait/notify实现生产者/消费者模式
- JAVA并发处理经验(四)并行模式与算法1:生产者消费与单例模式
- java wait/notify同步模式
- Thread详解9:用wait/notify实现生产者/消费者模式
- wait()+notify实现java生产者-消费者
- 3-5-Java多线程-案例-生产者&消费者wait¬ify
- 生产者与消费者模式-阻塞 wait,notify
- java 多线程之 wait(),notify(),notifyAll()以及经典的生产者消费者模型
- Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
- java wait notifyAll 生产者 消费者 BlockingDeque
- JAVA——利用wait和notify实现生产者和消费者
- java线程的wait方法和notify方法的运用(包含生产者消费者代码【已练习】)
- java 多线程(5) wait() / notify() 生产者消费者
- Java synchronized、wait、notify实现线程(生成消费者模式)
- Java多线程之~~~~使用wait和notify实现生产者消费者模型
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例