经典问题生产者与消费者java并发线程模拟实现
来源:互联网 发布:淘宝转化率提升 编辑:程序博客网 时间:2024/06/14 19:33
生产者与消费者问题是操作系统中一个基础的问题。大致描述如下:生产者生产产品,消费者消费该产品。生产者只有等待消费者将产品消费完之后才能继续生产下一个产品,而消费者只有等带生产者生产完才能进行消费。生产者依赖于消费者,消费者依赖于生产者。
将该问题放到Java中来实现就是一个并发的多线程的问题,为了保证数据的完整性,需要借助线程同步的synchronized,用于控制数据同步时的一致。
同时为了保证生产者和消费者之间有序的进行需要使用wait和notify来实现线程的等待和唤醒操作。
直接贴代码,有问题,欢迎交流
/** * 生产者消费者模拟 * Created by Gsr on 2016/9/19 0019. */public class ProducerConsumer { public static void main(String[] args) { Product info = new Product(); Producer pro = new Producer(info); Consumer con = new Consumer(info); new Thread(pro).start();//生产者先起动,用于生产 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(con).start(); }}/** * 产品信息 */class Product { public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } private String name = "生产者"; public String getContent() { return content; } public void setContent(String content) { this.content = content; } private String content = "产品0"; private boolean flag = true;//true表示正在生产,false表示可以消费,开始的时候必须置为true表示正在生产,还不能消费 public synchronized void set(String name, String content) {//用于模拟生产过程 while (!flag) {//表示还没有被取走,继续等待 try { super.wait();//等待 } catch (InterruptedException e) { e.printStackTrace(); } } this.setName(name); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } this.setContent(content); System.out.println("生产过程:"+this.getName()+" --> "+this.getContent()); flag = false;//改变标志位表示可以取走 super.notify(); } public synchronized void get() {//将产品取出,用于模拟消费过程 while (flag) {//表示还没有生产好,继续等待 try { super.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("消费过程: "+this.getName() + " --> " + this.getContent()); flag = true;//表示可以生产 super.notify(); }}/** * 生产者 */class Producer implements Runnable { private Product info = null;//保存Info引用 public Producer(Product info) { this.info = info; } @Override public void run() { boolean flag = true; while(true) { if (flag) { this.info.set("生产--1", "产品1"); flag = false; } else { this.info.set("生产--2", "产品2"); flag = true; } } }}/** * 消费者 */class Consumer implements Runnable{ private Product info = null; public Consumer(Product info){ this.info = info; } @Override public void run() { while(true) this.info.get(); }}
目前研究于Spark与Hadoop,群QQ号:521066396(spark,hadoop交流群),欢迎加入共同学习,一起进步~
1 0
- 经典问题生产者与消费者java并发线程模拟实现
- 经典线程同步问题(生产者&消费者)--Java实现
- 经典线程同步问题(生产者&消费者)--Java实现
- java模拟生产者与消费者问题(线程同步)
- Java经典线程同步问题------生产者与消费者
- Java经典线程同步问题------生产者与消费者
- 线程经典,生产者与消费者问题
- java线程模拟生产者消费者问题
- java线程模拟生产者与消费者
- 生产者与消费者 java经典线程法
- java线程经典之生产者与消费者
- java多线程实现生产者与消费者---经典问题
- java模拟实现生产者---消费者问题
- Java多线程模拟实现消费者生产者问题
- Java经典多线程问题--生产者与消费者
- 生产者消费者问题之Java线程实现
- Java 线程与并发研究系列五(生产者与消费者)
- Ruby:线程实现经典的生产者消费者问题
- -exec
- MVC编程实例----简易电子商务网站(一)
- Tyvj NOIP全真模拟系列赛(2)游记
- [数据结构与算法]模式匹配-数量词
- mysql免安装版安装配置过程中遇到的问题和相关的解决
- 经典问题生产者与消费者java并发线程模拟实现
- iOS 富文本(NSMutableAttributedString)详解
- Android API Level与version的对应关系
- POJ 3518
- 关于时间格式几种简单处理
- 进程通信方式
- NEFU OJ23
- Android:ScaleType与Matrix相关
- 一个用Java实现的双向队列,可以分别在头尾插入和删除节点