java多线程总结六:经典生产者消费者问题实现
这是个线程同步的经典例子,源代码如下:
- <span style="font-size:16px;">package demo.thread;
- /**
- *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。
- *其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品
- */
- public class ProducersAndConsumers {
- public static void main(String[] args) {
- Storage storage = new Storage();
- Thread consumer = new Thread(new Consumer(storage));
- consumer.setName("消费者");
- Thread producer = new Thread(new Producer(storage));
- producer.setName("生产者");
- consumer.start();
- producer.start();
- }
- }
- /**
- * 消费者
- */
- class Consumer implements Runnable {
- private Storage storage;
- public Consumer(Storage storage) {
- this.storage = storage;
- }
- @Override
- public void run() {
- storage.pop();
- }
- }
- /**
- * 生产者
- */
- class Producer implements Runnable {
- private Storage storage;
- public Producer(Storage storage) {
- this.storage = storage;
- }
- @Override
- public void run() {
- Product product = new Product("090505105", "电话");
- storage.push(product);
- }
- }
- /**
- * 产品类
- */
- class Product {
- private String id;// 产品id
- private String name;// 产品名称
- public Product(String id, String name) {
- this.id = id;
- this.name = name;
- }
- @Override
- public String toString() {
- return "(产品ID:" + id + " 产品名称:" + name + ")";
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- /**
- *仓库
- */
- class Storage {
- // 仓库容量为10
- private Product[] products = new Product[10];
- private int top = 0;
- // 生产者往仓库中放入产品
- public synchronized void push(Product product) {
- while (top == products.length) {
- try {
- wait();//仓库已满,等待
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //把产品放入仓库
- products[top++] = product;
- System.out.println(Thread.currentThread().getName() + " 生产了产品"
- + product);
- notifyAll();//唤醒等待线程
- }
- // 消费者从仓库中取出产品
- public synchronized Product pop() {
- while (top == 0) {
- try {
- wait();//仓库空,等待
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //从仓库中取产品
- --top;
- Product p = new Product(products[top].getId(), products[top].getName());
- products[top] = null;
- System.out.println(Thread.currentThread().getName() + " 消费了产品" + p);
- notifyAll();//唤醒等待线程
- return p;
- }
- }
- </span>
运行结果:
生产者 生产了产品(产品ID:090505105 产品名称:电话)
消费者 消费了产品(产品ID:090505105 产品名称:电话)
java多线程总结六:经典生产者消费者问题实现的更多相关文章
- Java 多线程学习笔记:生产者消费者问题
前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...
- java 多线程并发系列之 生产者消费者模式的两种实现
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据 ...
- java多线程系列15 设计模式 生产者 - 消费者模式
生产者-消费者 生产者消费者模式是一个非常经典的多线程模式,比如我们用到的Mq就是其中一种具体实现 在该模式中 通常会有2类线程,消费者线程和生产者线程 生产者提交用户请求 消费者负责处理生产者提交的 ...
- Java多线程之并发协作生产者消费者设计模式
两个线程一个生产者个一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性.常用的同步方法是采用标 ...
- Java多线程—阻塞队列和生产者-消费者模式
阻塞队列支持生产者-消费者这种设计模式.该模式将“找出需要完成的工作”与“执行工作”这两个过程分离开来,并把工作项放入一个“待完成“列表中以便在随后处理,而不是找出后立即处理.生产者-消费者模式能简化 ...
- “全栈2019”Java多线程第六章:中断线程interrupt()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- 【Java并发编程】:生产者—消费者模型
生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据“姓 ...
- java线程之多个生产者消费者
温故一下上一节所学习的生产者消费者代码: 两个线程时: 通过标志位flag的if判断和同步函数互斥较好解决两个线程,一个生产者.一个消费者交替执行的功能 类名:ProducterConsumerDem ...
随机推荐
- Hadoop HDFS概念学习系列之hdfs里的文件下载闲谈(二十六)
hdfs里的文件下载 可以,通过hadoop distributed system来下载,而且速度非常之快.涨知识!!! 或者,通过命令行的方式,也可以! ********************** ...
- 浅谈 html- table换行
这么久都没有来发表点总结了,看了园里的盆友发表的文章中,我发现自己也长进了不少. 但是,最近两天遇见了一个比较棘手的问题,就是在做web页面时,我用了一个table,这个页面是要供手机端调用的,所以在 ...
- js使用技巧大全
1.防止重新构建 var constructedHtml = ""; for(var i = 0,len = arr.length;i < len;i++){ constru ...
- 博客搬家啦。请访问我的新底盘www.boyipark.com
博客搬家啦.请访问我的新底盘 www.boyipark.com
- iOS开发Block的使用
Block 是从 iOS4引入的,在日常开发中,会经常用到Block.特别是在多线程中,Block的用处更广泛.而且,Block不仅可以接收参数,其本身也可以作为参数,因此,Block的功能非常强大. ...
- hdu3589 Jacobi symbol(二次剩余 数论题)
本题的注意点:n=p1*p2*p3......Pm 解法:直接利用公式a^((p-1)/2)=(a/p)mod p 即可求解. #include<stdio.h> #include< ...
- nape.dynamics.InteractionGroup
(转载http://tomyail.com/blog/1123) 说明: Filter只是Shape的属性,Nape为Interactor类提供了group属性,这个属性是一个InteractionG ...
- Libgdx Box2D真实---这缓释微丸(三:规则经常使用body和精灵联合)
介绍规则body怎样和图片结合.上一篇文章我介绍了box2D的基本知识,假设你用心的话.你会搜索网上相关简单demo吧.那些我就不写了.那么假设我用图片表示我的那个body.而不是简单线条.那该怎么办 ...
- Starling性能优化技巧十五则
Starling的性能优化要点 一.尽可能减少状态变更 如您所知,Starling使用Stage3D来渲染所有的可见对象.这就意味着所有的绘制都是GPU完成的. 现在,Starling可以一个接一个的 ...
- Redis 和 Memcached 的区别
来源:标点符 链接:http://www.biaodianfu.com/redis-vs-memcached.html Redis 的作者 Salvatore Sanfilippo 曾经对这两种基于内 ...