java实现的生产者和消费者问题-涉及线程同步与通信
来源:互联网 发布:天天向上网络作家专场 编辑:程序博客网 时间:2024/05/02 04:40
1:共享数据类
package com.pb.consumerandproducer;public class ShareData {private char c; //代表仓库里的产品private boolean isProduced = false; //是否还有供消费者消费的产品public synchronized void putData(char c) { //生产者生产产品放入仓库if(isProduced) { //仓库中还有未消费的产品System.out.println("仓库中还有未消费的产品,生产者等待");try {wait(); //将线程挂起} catch (InterruptedException e) {e.printStackTrace();}}this.c = c;isProduced = true; //标记为已生产notify(); //通知消费者消费,激活消费者线程System.out.println("生产者生产产品" + c + "通知消费者消费");}public synchronized char getData() { //消费者消费产品if(!isProduced) { //仓库中没有供消费的产品System.out.println("仓库中没有供消费的产品,消费者等待");try {wait();} catch (InterruptedException e) {e.printStackTrace();}}isProduced = false; //标记为未生产notify(); //通知生产者生产System.out.println("消费者消费了" + this.c + "通知生产者继续生产");return c;}}
2:生产者线程ProducerThread
package com.pb.consumerandproducer;/** * 生产者线程,每隔一段时间就生产一个产品 * @author ccna_zhang * */public class ProducerThread extends Thread{private ShareData shareData;public ProducerThread(ShareData shareData) {this.shareData = shareData;}public void run() {for(char ch = 'A'; ch <= 'D'; ch++) {try {Thread.sleep((int)(Math.random()*3000));} catch (InterruptedException e) {e.printStackTrace();}shareData.putData(ch); //把商品放进仓库}}}
3:消费者线程ConsumerThread
package com.pb.consumerandproducer;/** * 消费者线程 * @author ccna_zhang * */public class ConsumerThread extends Thread {private ShareData shareData;public ConsumerThread(ShareData shareData) {this.shareData = shareData;}public void run() {char ch;do {try {Thread.sleep((int)(Math.random()*3000));} catch (InterruptedException e) {e.printStackTrace();}ch = shareData.getData(); //从仓库中取出商品} while(ch != 'D');}}
4:测试类和结果
package com.pb.consumerandproducer;public class TestProcuderAndConsumer {public static void main(String[] args) {ShareData shareData = new ShareData();ConsumerThread consumerThread = new ConsumerThread(shareData);ProducerThread producerThread = new ProducerThread(shareData);consumerThread.start();producerThread.start();}}
结果:
生产者生产产品A通知消费者消费消费者消费了A通知生产者继续生产仓库中没有供消费的产品,消费者等待生产者生产产品B通知消费者消费消费者消费了B通知生产者继续生产仓库中没有供消费的产品,消费者等待生产者生产产品C通知消费者消费消费者消费了C通知生产者继续生产生产者生产产品D通知消费者消费消费者消费了D通知生产者继续生产
- java实现的生产者和消费者问题-涉及线程同步与通信
- 线程同步:生产者和消费者的问题
- Java线程之由生产者/消费者问题看线程同步与通信
- Java实现生产者与消费者的同步
- 【线程同步】java实现生产者消费者问题与线程中的wait与notify总结
- java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]
- 经典线程同步问题(生产者&消费者)--Java实现
- 经典线程同步问题(生产者&消费者)--Java实现
- 线程同步生产者和消费者c和java不同实现
- Java经典线程同步问题------生产者与消费者
- Java经典线程同步问题------生产者与消费者
- java模拟生产者与消费者问题(线程同步)
- java实现线程同步一个生产者和一个消费者
- 学习和理解JAVA线程同步--生产者与消费者例子
- 学习和理解JAVA线程同步--生产者与消费者例子
- java生产者消费者问题(线程同步与线程等待的应用)
- C#生产者与消费者问题 线程同步
- 线程同步-生产者与消费者问题
- uboot移植之uboot stage2
- oracle外部表!!!
- Java应用程序访问数据库的基本原理
- KMP算法 字符串匹配
- js验证密码安全强度
- java实现的生产者和消费者问题-涉及线程同步与通信
- C语言 文件操作
- 山东现网WEBSMAP页面显示异常案列分析(转自eggic.com)
- java中存储区的分类
- 花店橱窗设计(flower.pas/c/cpp)
- their youth
- 插件2:控制大写锁定键
- 内联函数
- 8421BCD码、ASCII码、二进制码原理以及相互之间的转换