package com.produce;

import java.util.LinkedList;
import java.util.Queue; /*@author shijin
* 生产者与消费者模型中,要保证以下几点:
* 1 同一时间内只能有一个生产者生产 生产方法加锁sychronized
* 2 同一时间内只能有一个消费者消费 消费方法加锁sychronized
* 3 生产者生产的同时消费者不能消费 生产方法加锁sychronized
* 4 消费者消费的同时生产者不能生产 消费方法加锁sychronized
* 5 共享空间空时消费者不能继续消费 消费前循环判断是否为空,空的话将该线程wait,释放锁允许其他同步方法执行
* 6 共享空间满时生产者不能继续生产 生产前循环判断是否为满,满的话将该线程wait,释放锁允许其他同步方法执行
*/ //主类
public class ProducerConsumer
{
public static void main(String[] args)
{
StackBasket s = new StackBasket();
Producer p = new Producer(s);
Consumer c = new Consumer(s);
Thread tp = new Thread(p);
Thread tc = new Thread(c);
tp.start();
tc.start();
}
} /**
* 馒头
* */
class Mantou
{
private int id; Mantou(int id){
this.id = id;
} public String toString(){
return "馒头ID" + id;
}
} /**
* 共享栈空间 仓库
* */
class StackBasket
{
Queue<Mantou> sm = new LinkedList<Mantou>();
int index = 6; /**
* show 生产方法.
* show 该方法为同步方法,持有方法锁;
* show 首先循环判断满否,满的话使该线程等待,释放同步方法锁,允许消费;
* show 当不满时首先唤醒正在等待的消费方法,但是也只能让其进入就绪状态,
* show 等生产结束释放同步方法锁后消费才能持有该锁进行消费
* @param m 元素
* @return 没有返回值
*/ public synchronized void push(Mantou m){
try{
while(index == sm.size()){
System.out.println("!!!!!!!!!生产满了!!!!!!!!!");
this.wait();
}
this.notify();
}catch(InterruptedException e){
e.printStackTrace();
}catch(IllegalMonitorStateException e){
e.printStackTrace();
}
//此处可执行逻辑操作,如从数据库取出数据
sm.offer(m);
System.out.println("生产了:" + m + " 仓库有:" + sm.size() + "个馒头");
} /**
* show 消费方法
* show 该方法为同步方法,持有方法锁
* show 首先循环判断空否,空的话使该线程等待,释放同步方法锁,允许生产;
* show 当不空时首先唤醒正在等待的生产方法,但是也只能让其进入就绪状态
* show 等消费结束释放同步方法锁后生产才能持有该锁进行生产
* @param b true 表示显示,false 表示隐藏
* @return 没有返回值
*/
public synchronized Mantou pop(){
try{
while(sm.size() == 0){
System.out.println("!!!!!!!!!消费光了!!!!!!!!!");
this.wait();
}
this.notify();
}catch(InterruptedException e){
e.printStackTrace();
}catch(IllegalMonitorStateException e){
e.printStackTrace();
}
Mantou mantou=sm.poll();
     //此处可执行逻辑代码,如将数据更新回数据库
System.out.println("消费了:" + mantou + " 仓库有:" + sm.size() + "个馒头");  
return mantou;
}
} /**
* 生产者
* */
class Producer implements Runnable
{
StackBasket ss = new StackBasket();
Producer(StackBasket ss){
this.ss = ss;
} /**
* show 生产进程.
*/
public void run(){
for(int i = 0;i < 20;i++){
Mantou m = new Mantou(i);
ss.push(m);
// System.out.println("生产了:" + m + " 共" + ss.index + "个馒头");
// 在上面一行进行测试是不妥的,对index的访问应该在原子操作里,因为可能在push之后此输出之前又消费了,会产生输出混乱
try{
Thread.sleep((int)(Math.random()*500));
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
} /**
* 消费者
* */
class Consumer implements Runnable
{
StackBasket ss = new StackBasket();
Consumer(StackBasket ss){
this.ss = ss;
} /**
* show 消费进程.
*/
public void run(){
for(int i = 0;i < 20;i++){
Mantou m = ss.pop();
//System.out.println("消费了:---------" + m + " 共" + ss.index + "个馒头");
//同上 在上面一行进行测试也是不妥的,对index的访问应该在原子操作里,因为可能在pop之后此输出之前又生产了,会产生输出混乱
try{
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}

输出结果:

!!!!!!!!!消费光了!!!!!!!!!
生产了:馒头ID0 仓库有:1个馒头
消费了:馒头ID0 仓库有:0个馒头
生产了:馒头ID1 仓库有:1个馒头
生产了:馒头ID2 仓库有:2个馒头
生产了:馒头ID3 仓库有:3个馒头
消费了:馒头ID1 仓库有:2个馒头
生产了:馒头ID4 仓库有:3个馒头
消费了:馒头ID2 仓库有:2个馒头
生产了:馒头ID5 仓库有:3个馒头
消费了:馒头ID3 仓库有:2个馒头
生产了:馒头ID6 仓库有:3个馒头
生产了:馒头ID7 仓库有:4个馒头
生产了:馒头ID8 仓库有:5个馒头
消费了:馒头ID4 仓库有:4个馒头
生产了:馒头ID9 仓库有:5个馒头
生产了:馒头ID10 仓库有:6个馒头
!!!!!!!!!生产满了!!!!!!!!!
消费了:馒头ID5 仓库有:5个馒头
生产了:馒头ID11 仓库有:6个馒头
!!!!!!!!!生产满了!!!!!!!!!
消费了:馒头ID6 仓库有:5个馒头
生产了:馒头ID12 仓库有:6个馒头
!!!!!!!!!生产满了!!!!!!!!!
消费了:馒头ID7 仓库有:5个馒头
生产了:馒头ID13 仓库有:6个馒头
消费了:馒头ID8 仓库有:5个馒头
消费了:馒头ID9 仓库有:4个馒头
生产了:馒头ID14 仓库有:5个馒头
生产了:馒头ID15 仓库有:6个馒头
消费了:馒头ID10 仓库有:5个馒头
生产了:馒头ID16 仓库有:6个馒头
!!!!!!!!!生产满了!!!!!!!!!
消费了:馒头ID11 仓库有:5个馒头
生产了:馒头ID17 仓库有:6个馒头
!!!!!!!!!生产满了!!!!!!!!!
消费了:馒头ID12 仓库有:5个馒头
生产了:馒头ID18 仓库有:6个馒头
消费了:馒头ID13 仓库有:5个馒头
生产了:馒头ID19 仓库有:6个馒头
消费了:馒头ID14 仓库有:5个馒头
消费了:馒头ID15 仓库有:4个馒头
消费了:馒头ID16 仓库有:3个馒头
消费了:馒头ID17 仓库有:2个馒头
消费了:馒头ID18 仓库有:1个馒头
消费了:馒头ID19 仓库有:0个馒头

java之生产者与消费者的更多相关文章

  1. Windows下RabbitMQ 的下载、配置、Java实现生产者和消费者例子

    RabbitMQ是一个轻量级的消息代理中间件,支持多种消息通信协议,支持分布式部署,支持运行于多个操作系统,具有灵活.高可用等特性.RabbitMQ支持多种协议,其中最为重要的是高级消息队列协议(AM ...

  2. java实现生产者和消费者问题

    Java实现生产者和消费者问题 欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti

  3. Java实现生产者和消费者

    生产者和消费者问题是操作系统的经典问题,在实际工作中也常会用到,主要的难点在于协调生产者和消费者,因为生产者的个数和消费者的个数不确定,而生产者的生成速度与消费者的消费速度也不一样,同时还要实现生产者 ...

  4. java线 生产者和消费者

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  5. Java实现生产者与消费者模式

    生产者不断向队列中添加数据,消费者不断从队列中获取数据.如果队列满了,则生产者不能添加数据:如果队列为空,则消费者不能获取数据.借助实现了BlockingQueue接口的LinkedBlockingQ ...

  6. Java中生产者与消费者模式

    生产者消费者模式 首先来了解什么是生产者消费者模式.该模式也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...

  7. java之生产者和消费者问题

    package testThread; public class Test3 { public static void main(String[] args) { Clerk c = new Cler ...

  8. 菜鸡的Java笔记 生产者与消费者

    生产者与消费者        代码要求知道做什么用即可        线程间的通讯问题以及 Object 类的支持            基础模型        现在希望实现一种数据的生产和取出的操作 ...

  9. Java 多线程-生产者、消费者

    一.整体代码 ThreadDemo.java public class ThreadDemo { public static void main(String[] args) { Godown god ...

随机推荐

  1. dump java

    http://www.gamlor.info/wordpress/2011/09/visualvm/ https://visualvm.java.net/zh_CN/gettingstarted.ht ...

  2. Linux实时监控工具Nmon使用

    官网:http://nmon.sourceforge.net/pmwiki.php?n=Main.HomePage 下载:http://sourceforge.net/projects/nmon/fi ...

  3. ABBYY应用到的行业有哪些

    不同的行业组织和企业有不同的业务流程和规定,在OCR文字识别领域,ABBYY FineReader 12给各个行业都提供了有效解决方案,满足其特定需求的同时还帮助他们提高业务流程处理效率,降低成本,全 ...

  4. C#实现通过模板自动创建Word文档的方法

    原文地址:http://www.jb51.net/article/55332.htm   本文实例讲述了C#实现通过模板自动创建Word文档的方法,是非常实用的技巧.分享给大家供大家参考.具体实现方法 ...

  5. Linux-NTP-Server+Client

    GMT/UTC/CST;/etc/localtime,/usr/share/zoneinfo/*时区文件,/etc/profile加TZ变量;硬件时间RTC,系统时间;date,hwclock,tzs ...

  6. 【转】纯CSS设置Checkbox复选框控件的样式

    Checkbox复选框是一个可能每一个网站都在使用的HTML元素,但大多数人并不给它们设置样式,所以在绝大多数网站它们看起来是一样的.为什么不把你的网站中的Checkbox设置一个与众不同的样式,甚至 ...

  7. ORA-27086: unable to lock file - already in use

    问题现象: SQL> startup ORACLE instance started. Total System Global Area 1854021632 bytes Fixed Size  ...

  8. .NET导入openssl生成的公钥之BEGIN RSA PUBLIC KEY

    .NET导入openssl生成的公钥之BEGIN RSA PUBLIC KEY 我得到了一个公钥,形式如下 -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMroxz3 ...

  9. jquery读取csv文件并用json格式输出

    直接贴上代码: <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untit ...

  10. LintCode "Submatrix Sum"

    Naive solution is O(n^4). But on 1 certain dimension, naive O(n^2) can be O(n) by this well-known eq ...