胶多不粘话多不甜,直接上代码:

生产者类:

/**
* Created by 51304 on 2016/2/28.
*/
public class P {
private String lock;
public P(String lock){
this.lock = lock;
} public void setValue(){
try{
synchronized (this.lock){
if(!ValueObject.value.equals("")){
lock.wait();
}
String value = System.currentTimeMillis() + "_" +
System.nanoTime();
System.out.println("set value is " + value);
ValueObject.value = value;
lock.notify();
}
} catch (InterruptedException e){
e.printStackTrace();
}
}
}

消费者类:

import com.sun.org.apache.xpath.internal.SourceTree;

/**
* Created by 51304 on 2016/2/28.
*/
public class C {
private String lock;
public C(String lock){
this.lock = lock;
} public void getValue(){
try{
synchronized (this.lock){
if(ValueObject.value.equals("")){
this.lock.wait();
}
System.out.println("get value is " + ValueObject.value);
ValueObject.value = "";
this.lock.notify();
}
} catch (InterruptedException e){
e.printStackTrace();
}
}
}

存储值的对象:

/**
* Created by 51304 on 2016/2/28.
*/
public class ValueObject {
public static String value = "";
}

生产者线程:

/**
* Created by 51304 on 2016/2/28.
*/
public class ThreadP extends Thread {
private P p;
public ThreadP(P p){
this.p = p;
} @Override
public void run(){
while (true){
p.setValue();
}
}
}

消费者线程:

/**
* Created by 51304 on 2016/2/28.
*/
public class ThreadC extends Thread {
private C c;
public ThreadC(C c){
this.c = c;
} @Override
public void run(){
while (true){
c.getValue();
}
}
}

main方法:

/**
* Created by 51304 on 2016/2/28.
*/
public class TestMain {
public static void main(String[] args) {
String lock = new String("");
P p = new P(lock);
C c = new C(lock); ThreadP threadP =new ThreadP(p);
ThreadC threadC = new ThreadC(c); threadP.start();
threadC.start();
}
}

运行截图:

思考:如果多生产者和多消费者程序能正常工作吗?

答案是:程序会出现假死,也就是所有线程都停留在等待状态。出现这个现象的原因是,多生产者模式下notify()通知的线程还是生产者(选择通知那个线程时随机的,但只会通知一个),同理消费者也一样。当然解决的办法很明显使用notifyall().

java生产者/消费者模式实现——一生产者一消费者(操作值)的更多相关文章

  1. 生产都消费者模式的一个demo,消费者设置缓存

    package queue; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlocki ...

  2. Java多线程-----实现生产者消费者模式的几种方式

       1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...

  3. Java并发(基础知识)—— 阻塞队列和生产者消费者模式

    1.阻塞队列                                                                                        Blocki ...

  4. Java并发编程()阻塞队列和生产者-消费者模式

    阻塞队列提供了可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put方法将阻塞直到有空间可用:如果队列为空,那么take方法将会阻塞直到有元素可用.队列可以 ...

  5. java实现多线程生产者消费者模式

    1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...

  6. 转:Task任务调度实现生产者消费者模式

    我们经常会遇到生产者消费者模式,比如前端各种UI操作事件触发后台逻辑等.在这种典型的应用场景中,我们可能会有4个业务处理逻辑(下文以P代表生产者,C代表消费者): 1. FIFO(先进先出)      ...

  7. python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式

    (1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...

  8. 生产者消费者模式 php 【转】

    在工作中常常听到某某大牛之间的交谈会涉及到,xx消费者啊啥的,到底什么大牛之间讲的是什么? 这篇文章主要解决三个问题: 1.到底什么是生产者和消费者,以及它们之间的故事 2.它们之间靠什么交流 3.应 ...

  9. Linux进程通信之共享内存实现生产者/消费者模式

    共享内存 共享内存是内核为进程创建的一个特殊内存段,它将出现在进程自己的地址空间中,其它进程可以将同一段共享内存连接(attach)到自己的地址空间.这是最快的进程间通信方式,但是不提供任何同步功能( ...

随机推荐

  1. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)

    最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道< ...

  2. NOIP2012同余方程[exgcd]

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开 输出格式: 输出只有一行,包含一个正整 ...

  3. 一段拼装sql的小代码

    /** * 单表查询 * * className:实体类的名字 * vals:查询的属性 * pNames:条件的名字 * pVals:条件的值 */ @Override public List< ...

  4. PAT 1037. 在霍格沃茨找零钱(20)

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.& ...

  5. Java面试宝典摘抄

    1,ClassLoader知识 加载流程:当运行一个程序时,JVM启动,运行bootstrap classloader,该classloader加载Java核心API(此时ExtClassLoader ...

  6. css 隔行变色,表单布局

    隔行变色: #list1 li:nth-of-type(odd){ background:#00ccff;}奇数行  #list1 li:nth-of-type(even){ background:# ...

  7. 深入理解Java:内部类

    什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public ...

  8. C#-WebForm-ASP开发练习:从数据库中动态添加信息

    传统的ASP开发方式,是C#代码和HTML代码混合在一起,ASP与ASP.NET不是一个东西. <%  %>  -  可以扩起来一段范围,这一段范围之内只能允许编写C#代码 <%= ...

  9. jQuery 教程

    jQuery 教程 W3School H-ui前端框架 html标签

  10. mac开机密码忘记了, 新建用户方法

    第一步:重启电脑,然后按住shift+commond+s; 第二步:输入: fsck -ymount -uaw /rm /var/db/.AppleSetupDone reboot 第三步:根据提示创 ...