问题描述:生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞

实现方法:使用synchronized关键字结合wait()和notify()实现

生产者代码:

 class Producer implements Runnable{

         @Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1;i <= 10; i++) {
System.out.println("生产者第" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
synchronized (lock) {
while(count >= max) { //防止假唤醒(唤醒之后发现条件不满足)
try {
lock.wait(); //释放锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
count++;
System.out.println("生产者:" + Thread.currentThread().getName() + "完成生产:"+i+",当前count=" + count );
lock.notifyAll();
}
}
} }

消费者代码:

 class Consumer implements Runnable{

         @Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1;i <= 10; i++) {
System.out.println("消费者第" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
synchronized (lock) {
while(count == 0) { //防止假唤醒(唤醒之后发现条件不满足)
try {
lock.wait(); //释放锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*不要用if语句
if(count == 0) {
try {
lock.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
*/
count--;
System.out.println("消费者:" + Thread.currentThread().getName() + "完成消费"+i+",当前count=" + count );
lock.notifyAll();
}
}
} }

运行主程序:

 public static void main(String[] args) {
// TODO Auto-generated method stub
ConsumerAndProducer test = new ConsumerAndProducer();
new Thread(test.new Producer(),"生产者1").start();
new Thread(test.new Producer(),"生产者2").start();
new Thread(test.new Producer(),"生产者3").start();
new Thread(test.new Consumer(),"消费者1").start();
new Thread(test.new Consumer(),"消费者2").start();
new Thread(test.new Consumer(),"消费者3").start();
}

输出:

生产者:生产者1完成生产:1,当前count=1
生产者:生产者2完成生产:1,当前count=2
生产者:生产者3完成生产:1,当前count=3
消费者:消费者3完成消费1,当前count=2
消费者:消费者2完成消费1,当前count=1
消费者:消费者1完成消费1,当前count=0
生产者:生产者1完成生产:2,当前count=1
生产者:生产者2完成生产:2,当前count=2
生产者:生产者3完成生产:2,当前count=3
消费者:消费者3完成消费2,当前count=2
消费者:消费者1完成消费2,当前count=1
消费者:消费者2完成消费2,当前count=0
生产者:生产者1完成生产:3,当前count=1
生产者:生产者3完成生产:3,当前count=2
生产者:生产者2完成生产:3,当前count=3
消费者:消费者2完成消费3,当前count=2
消费者:消费者1完成消费3,当前count=1
消费者:消费者3完成消费3,当前count=0
生产者:生产者1完成生产:4,当前count=1
生产者:生产者2完成生产:4,当前count=2
生产者:生产者3完成生产:4,当前count=3
消费者:消费者1完成消费4,当前count=2
消费者:消费者3完成消费4,当前count=1
消费者:消费者2完成消费4,当前count=0
生产者:生产者1完成生产:5,当前count=1
生产者:生产者2完成生产:5,当前count=2
生产者:生产者3完成生产:5,当前count=3
消费者:消费者3完成消费5,当前count=2
消费者:消费者1完成消费5,当前count=1
消费者:消费者2完成消费5,当前count=0
生产者:生产者1完成生产:6,当前count=1
生产者:生产者3完成生产:6,当前count=2
生产者:生产者2完成生产:6,当前count=3
消费者:消费者3完成消费6,当前count=2
消费者:消费者2完成消费6,当前count=1
消费者:消费者1完成消费6,当前count=0
生产者:生产者1完成生产:7,当前count=1
生产者:生产者2完成生产:7,当前count=2
生产者:生产者3完成生产:7,当前count=3
消费者:消费者3完成消费7,当前count=2
消费者:消费者2完成消费7,当前count=1
消费者:消费者1完成消费7,当前count=0
生产者:生产者1完成生产:8,当前count=1
生产者:生产者2完成生产:8,当前count=2
生产者:生产者3完成生产:8,当前count=3
消费者:消费者3完成消费8,当前count=2
消费者:消费者2完成消费8,当前count=1
消费者:消费者1完成消费8,当前count=0
生产者:生产者1完成生产:9,当前count=1
生产者:生产者3完成生产:9,当前count=2
生产者:生产者2完成生产:9,当前count=3
消费者:消费者3完成消费9,当前count=2
消费者:消费者1完成消费9,当前count=1
消费者:消费者2完成消费9,当前count=0
生产者:生产者1完成生产:10,当前count=1
生产者:生产者3完成生产:10,当前count=2
生产者:生产者2完成生产:10,当前count=3
消费者:消费者3完成消费10,当前count=2
消费者:消费者2完成消费10,当前count=1
消费者:消费者1完成消费10,当前count=0

Java实现生产者消费者(一)的更多相关文章

  1. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

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

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

  3. java实现生产者消费者问题

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  4. java实现生产者消费者问题(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  5. [转载] Java实现生产者消费者问题

    转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...

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

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

  7. java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 解说演示样例 --thinking java4

    package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import jav ...

  8. Java 实现生产者 – 消费者模型

    转自:http://www.importnew.com/27063.html 考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题.有如下几个考点: 对Java并发模型的理解 对Java ...

  9. Java——Java实现生产者消费者

    1.生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括"生产者"."消费者"."仓库"和"产品" ...

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

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

随机推荐

  1. python中的if not

    在python中 None,  False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于False ,即: not None == not False = ...

  2. Xcode查看iOS崩溃与崩溃日志分析

    一.造成崩溃的原因 1.代码中存在bug 2.Watchdog 超时机制 3.用户强制退出 4.低内存终止 5.其他违法系统规则的操作,大部分是内存问题 二.崩溃的类型 1.信号错误类 (1)EXC_ ...

  3. 实战_2:eclipseRCP项目结构

    RCP项目目录结构如下: src: java源码目录 bin:class文件目录 JRE System Library: 系统类库依赖,主要是JDK,JRE相关的 Plugin-in Dependen ...

  4. vue element 关闭当前tab 跳转到上一路由

    方法一 this.$store.dispatch('delVisitedViews', this.$route); this.$router.go(-1); 方法二 this.$store.state ...

  5. Invalid action class configuration that references an unknown class解决方案

    Sturts2整合后时出现诡异的异常: java.lang.RuntimeException: Invalid action class configuration that references a ...

  6. 吴裕雄--天生自然Android开发学习:魅蓝3开启USB调试

    打开手机点击:设置 选择:关于手机 在详情里面找到:版本号,然后不断地点击那个版本号. 然后返回一步 再选择设置里面的:辅助功能 再选择辅助功能里面的:开发者选项 进入开发者选项后,选择打开两项:一是 ...

  7. JavaScript学习总结(一)基础部分

    转自:http://segmentfault.com/a/1190000000652749 基本概念 javascript是一门解释型的语言,浏览器充当解释器. js执行引擎并不是一行一行的执行,而是 ...

  8. Python: Socket网络编程,多线程处理小Demo

    一个简单的例子,深入研究一下socket的多线程处理任务 Server端: #!/usr/bin/env python #encoding:utf8 # # 注意:定义encoding时必须在第二行 ...

  9. 使用jxl操作之一: 实现对Excel简单读写操作

    项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String u ...

  10. java的自增和自减

    class Untitled { public static void main(String[] args) { int a = 3; int b = a++; //a先赋值给b,然后a再自己加1 ...