在说生产者消费者模式之前,我觉得有必要理解一下 Obj.wait(),与Obj.notify()方法。wait()方法是指在持有对象锁的线程调用此方法时,会释放对象锁,同时休眠本线程。notify()方法是持有相同的对象锁来唤醒休眠的线程,使其具有抢占cpu的资格。可以理解同步方法,同步方法的对象锁就是谁调用这个方法,这个对象就是对象锁。

根据李兴华老师的视频讲解,建立一个生产者类,一个消费者类,还有一个Info类,贴上代码:

1.生产者类

package com.company;

/**
* Created by Administrator on 2016/8/30.
*/
public class Productor implements Runnable { private Info info; public Productor(Info info) {
this.info = info;
} @Override
public void run() { for (int i=0;i<50;i++)
{
if (i%2==0)
{
// info.setTitle("陶帅");
// info.setContent("一个帅哥");
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
info.set("陶帅","一个帅哥");
}else {
// info.setTitle("可爱的动物");
// info.setContent("草泥马");
info.set("可爱的动物","草泥马");
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
}
}
}

2.消费者类

package com.company;

/**
* Created by Administrator on 2016/8/30.
*/
public class Consumer implements Runnable {
private Info info; public Consumer(Info info) {
this.info = info;
} @Override
public void run() { for (int i=0;i<50;i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
info.get();
}
}
}

3.Info类(重点)

package com.company;

/**
* Created by Administrator on 2016/8/30.
*/
public class Info {
private String Title;
private String content;
private boolean flag=true;//true表示可以生产不能取走消费,false相反 public synchronized void set(String Titile,String content){
if (!flag)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.Title=Titile;
this.content=content;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} flag=false;
notify();
} public synchronized void get(){
if (flag)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.Title+"------->"+this.content);
flag=true;
notify();
} // public String getTitle() {
// return Title;
// }
//
// public void setTitle(String title) {
// Title = title;
// }
//
// public String getContent() {
// return content;
// }
//
// public void setContent(String content) {
// this.content = content;
// }
}

4.测试类

package com.company;

public class Main {

    public static void main(String[] args) {
Info info=new Info();
Productor p=new Productor(info);
Consumer c=new Consumer(info);
new Thread(p).start();
new Thread(c).start();
}
}

总结分析:生产者和消费者两个线程同时抢占CPU,假如消费者先抢到,此时调用get()方法即消费取走,但是此时flag为true,因此会进入wait()方法,所以此时只能是生产者抢占到CPU,根据生产者调用set()方法,生产后执行

        flag=false;
notify();

此时生产者和消费者所在的两个线程又站在同一起跑线上了,继续CPU争夺战。如果不幸的消费者又没有抢过生产者,生产者继续执行set();此时flag已经是false了,根据代码

 if (!flag)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

所以生产者只能乖乖的wait();CPU回到消费者这里,循环往复,模式就出来了,完美!

												

关于java中生产者消费者模式的理解的更多相关文章

  1. Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...

  2. 转:Task任务调度实现生产者消费者模式 (个人理解后文)

    纯属个人愚见.欢迎加入反驳(PiDou). 1.前文大致就是,利用Queue配置的一个TaskFactory任务调度器.实现生产者消费者模式的例子..首先我就试了 第一种 FIFO(先进先出)的配置. ...

  3. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  4. java实现生产者消费者模式

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...

  5. java 实现生产者-消费者模式

    生产和消费者模式有很多种,现在介绍几种常见的方式 wait/notify实现生产和消费者模式 1.使用wait/notify实现生产和消费者模式: public class Depot { // 实际 ...

  6. java——利用生产者消费者模式思想实现简易版handler机制

    参考教程:http://www.sohu.com/a/237792762_659256 首先说一下这里面涉及到的线程: 1.mainLooper: 这个线程可以理解为消费者线程,里面运行了一个死循环, ...

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

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

  8. Java 生产者消费者模式详细分析

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. 基于Java 生产者消费者模式(详细分析)

    Java 生产者消费者模式详细分析 本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模 ...

随机推荐

  1. (注意格式,代替C++的getchar())汉字统计hdu2030

    汉字统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. tcp的4次挥手、三次握手

    1. TCP短连接模拟一种TCP短连接的情况:1. client 向 server 发起连接请求2. server 接到请求,双⽅建⽴连接3. client 向 server 发送消息4. serve ...

  3. Spark进阶之路-Spark HA配置

    Spark进阶之路-Spark HA配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 集群部署完了,但是有一个很大的问题,那就是Master节点存在单点故障,要解决此问题,就要借 ...

  4. 小心错误使用EasyUI 让网站性能减半

    先不谈需求,和系统架构,直接上来就被抛来了一个问题----基础性能太差了,一个网页打开要好几秒.我了个天,我听了也简直不敢相信,难道是数据量特别大?还是其中业务逻辑特别复杂? 简单的介绍下,基础系统是 ...

  5. 震惊!最全PyCharm教程

    PyCharm PyCharm是一个用于计算机编程的集成开发环境(IDE),主要用于Python语言开发,由捷克公司JetBrains开发,提供代码分析.图形化调试器,集成测试器.集成版本控制系统(V ...

  6. 010、base镜像 (2018-12-27 周四)

    参考https://www.cnblogs.com/CloudMan6/p/6799197.html   什么是base镜像       不依赖其他镜像,从scratch构建.或者是其他可以作为基础镜 ...

  7. Js/Jquery 关闭 离开或刷新当前页面时提醒,和执行解绑取消提醒

    如图,现在的 cnblogs 或者QQ邮箱编辑页面,刷新.关闭提醒: <script src="../../Common/Js/jquery-1.8.1.min.js"> ...

  8. jQuery-easyui和validate表单验证实例

    jQuery EasyUI 表单 - 表单验证插件validatebox 使用时需要向页面引入两个css文件如下: <link rel="stylesheet" href=& ...

  9. luogu 4158 粉刷匠 dp套dp

    dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...

  10. 数据库 之 E-R设计感想

    1.实体与实体之间的关系,在许多情况下,可以将其实体化为实体(弱实体),例如:员工租赁宿舍,可以将租赁弱实体化为实体(具有唯一主键ID) 2.一些具有特征的关系可以(弱)实体化为实体 3.实体里面可以 ...