生产者与消费者-1:N-基于list
一个生产者/多个消费者:
1 /** 2 * 生产者 3 */ 4 public class P { 5 6 private MyStack stack; 7 8 public P(MyStack stack) { 9 this.stack = stack; 10 } 11 12 public void pushService() { 13 stack.push(); 14 } 15 }
1 /** 2 * 消费者 3 */ 4 public class C { 5 6 private MyStack stack; 7 8 public C(MyStack stack) { 9 this.stack = stack; 10 } 11 12 public void popService() { 13 System.out.println("pop = " + stack.pop()); 14 } 15 }
1 /** 2 * 模拟栈 3 */ 4 public class MyStack { 5 6 private List<Object> list = new ArrayList<>(); 7 8 public synchronized void push() { 9 try { 10 while(list.size() == 1) { 11 this.wait(); 12 } 13 list.add(""+Math.random()); 14 this.notifyAll(); 15 System.out.println("push:" + list.size()); 16 } catch (InterruptedException e) { 17 e.printStackTrace(); 18 } 19 } 20 21 public synchronized String pop() { 22 String value = ""; 23 try { 24 while(list.size() == 0) { 25 System.out.println("pop 操作中:" + Thread.currentThread().getName() + "wait状态"); 26 this.wait(); 27 } 28 value = ""+list.get(0); 29 list.remove(0); 30 this.notifyAll(); 31 System.out.println("pop:" + list.size()); 32 } catch (InterruptedException e) { 33 e.printStackTrace(); 34 } 35 return value; 36 } 37 }
1 /** 2 * 生产者线程 3 */ 4 public class P_Thread extends Thread { 5 6 private P p; 7 8 public P_Thread(P p) { 9 this.p = p; 10 } 11 12 @Override 13 public void run() { 14 while (true) { 15 p.pushService(); 16 } 17 } 18 }
1 /** 2 * 消费者线程 3 */ 4 public class C_Thread extends Thread { 5 6 private C c; 7 8 public C_Thread(C c) { 9 this.c = c; 10 } 11 12 @Override 13 public void run() { 14 while (true) { 15 c.popService(); 16 } 17 } 18 }
1 /** 2 * 测试类 3 */ 4 public class Run { 5 6 public static void main(String[] args) { 7 MyStack stack = new MyStack(); 8 //一个生产者 9 P p = new P(stack); 10 //多个消费者 11 C c1 = new C(stack); 12 C c2 = new C(stack); 13 C c3 = new C(stack); 14 15 //一个生产者线程 16 P_Thread pThread = new P_Thread(p); 17 //多个消费者线程 18 C_Thread cThread1 = new C_Thread(c1); 19 C_Thread cThread2 = new C_Thread(c2); 20 C_Thread cThread3 = new C_Thread(c3); 21 22 //启动 23 pThread.start(); 24 cThread1.start(); 25 cThread2.start(); 26 cThread3.start(); 27 } 28 }
运行结果如下:
转载于:https://www.cnblogs.com/wang1001/p/9561610.html
生产者与消费者-1:N-基于list相关推荐
- linux使用线程实现生产者消费者问题,Linux下生产者与消费者的线程实现
代码见<现代操作系统> 第3版. 为了显示效果,添加了printf()函数来显示运行效果 #include #include #define MAX 20 pthread_mutex_t ...
- java消费者模式_基于Java 生产者消费者模式(详细分析)
生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...
- Linux系统编程40:多线程之基于环形队列的生产者与消费者模型
文章目录 (1)什么是信号量 (2)与信号量相关的操作 (3)基于环形队列的生产者与消费者模型-信号量(单消费者单生产者) (1)什么是信号量 前面的叙述中,我们通过锁保证了每次只有一个线程进入临界区 ...
- Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型
文章目录 (1)生产者与消费者模型概述 (2)生产者与消费者模型优点 (3)基于阻塞队列(blockingqueue)的生产者消费者模型(单消费者单生产者) (4)基于阻塞队列(blockingque ...
- [Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )
文章目录 生产者消费者模型 函数调用角度理解生产者消费者模型 生活角度理解生产者消费者模型 为什么要使用生产者消费者模型 生产者消费者模型优点 321原则 基于BlockingQueue的生产者消费者 ...
- 基于java多线程来实现生产者和消费者的实例
声明:本实例是在网上看到,做了很小的修改.所以感谢之前的作者.只是一时忘了哪儿看到,没法加入链接,向原作者道歉,以示尊重.抱歉-^)... 同步栈: 1 class SycnStack { 2 pri ...
- 基于kafka_2.11-2.1.0实现的生产者和消费者代码样例
1.搭建部署好zookeeper集群和kafka集群,这里省略. 1 启动zk: 2 bin/zkServer.sh start conf/zoo.cfg. 3 验证zk是否启动成功: 4 bin/z ...
- Java中生产者与消费者问题的演变
想要了解更多关于Java生产者消费者问题的演变吗?那就看看这篇文章吧,我们分别用旧方法和新方法来处理这个问题. 生产者消费者问题是一个典型的多进程同步问题. 对于大多数人来说,这个问题可能是我们在学校 ...
- 生产者,消费者,CDN
1 生产者消费者模型应用场景及优势? 什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进 ...
- 网络爬虫:分离生产者和消费者来优化爬虫程序
问题描述: 基于前面的一些工作(可点击这里参见笔者前面的相关博客),我们取得了一些成果.不过存在的问题又总是会让人坐立不安.本文通过分离生产者.消费者以及引入连接池技术来优化爬虫程序.解决前面说到的数 ...
最新文章
- 4款基于jquery的列表图标动画切换特效
- 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串
- linux学习——大话linux网络
- LSGO软件技术团队与信息1402班开展真人CS活动
- python到包快捷键_如何最简单、通俗地理解Python的包?
- 20190808估值方法
- 大数据学长面试之华为面试题
- 微信小程序获取openId,传参问题导致参数无效(errcode: 40013、errcode:40125、errcode“:40029)
- 简单介绍JVM的GC过程
- android twitter第三方登录,android中接入twitter进行第三方登录
- shell脚本-md5码
- Unity导航小地图制作
- 刚刚,北大智能学院成立!AI视觉泰斗朱松纯教授任院长
- 在一个页面同时引入两个百度地图
- 中国地区三级联动下拉菜单
- 3000字梳理大数据开发流程及规范(建议收藏)
- oracle中start with ... connect by prior的用法(图文并茂,一看就懂!!)
- jiecaovideoplayer视频播放开源框架的使用步骤
- (附源码)计算机毕业设计ssm高校勤工助学管理系统
- 一文读懂马云、马化腾、李彦宏、库克等互联网大佬们都在乌镇干了啥
热门文章
- 怎么让上下两排对齐_为什么你家装饰画怎么挂都怪怪的?看完再装立马就能美翻了!...
- 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验须进行最少()次预压。A.1B.2C.3D.4...
- 目标检测--Accurate Single Stage Detector Using Recurrent Rolling Convolution
- 【numpy】协方差计算
- python 案例串接_来撸串,一个案例轻松认识Python 字符串——翻转拼接游戏
- Centos7安装Elasticsearch
- leetcode--笔记——120. 三角形最小路径和
- pandas转mysql特定列_在pandas.DataFrame.to_sql时指定数据库表的列类型
- java收银台程序gui_javaSE小项目---简易收银台
- pythonmysql数据库系统实战_Python实战之MySQL数据库操作