一个生产者/多个消费者:

 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相关推荐

  1. linux使用线程实现生产者消费者问题,Linux下生产者与消费者的线程实现

    代码见<现代操作系统> 第3版. 为了显示效果,添加了printf()函数来显示运行效果 #include #include #define MAX 20 pthread_mutex_t ...

  2. java消费者模式_基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  3. Linux系统编程40:多线程之基于环形队列的生产者与消费者模型

    文章目录 (1)什么是信号量 (2)与信号量相关的操作 (3)基于环形队列的生产者与消费者模型-信号量(单消费者单生产者) (1)什么是信号量 前面的叙述中,我们通过锁保证了每次只有一个线程进入临界区 ...

  4. Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型

    文章目录 (1)生产者与消费者模型概述 (2)生产者与消费者模型优点 (3)基于阻塞队列(blockingqueue)的生产者消费者模型(单消费者单生产者) (4)基于阻塞队列(blockingque ...

  5. [Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )

    文章目录 生产者消费者模型 函数调用角度理解生产者消费者模型 生活角度理解生产者消费者模型 为什么要使用生产者消费者模型 生产者消费者模型优点 321原则 基于BlockingQueue的生产者消费者 ...

  6. 基于java多线程来实现生产者和消费者的实例

    声明:本实例是在网上看到,做了很小的修改.所以感谢之前的作者.只是一时忘了哪儿看到,没法加入链接,向原作者道歉,以示尊重.抱歉-^)... 同步栈: 1 class SycnStack { 2 pri ...

  7. 基于kafka_2.11-2.1.0实现的生产者和消费者代码样例

    1.搭建部署好zookeeper集群和kafka集群,这里省略. 1 启动zk: 2 bin/zkServer.sh start conf/zoo.cfg. 3 验证zk是否启动成功: 4 bin/z ...

  8. Java中生产者与消费者问题的演变

    想要了解更多关于Java生产者消费者问题的演变吗?那就看看这篇文章吧,我们分别用旧方法和新方法来处理这个问题. 生产者消费者问题是一个典型的多进程同步问题. 对于大多数人来说,这个问题可能是我们在学校 ...

  9. 生产者,消费者,CDN

    1 生产者消费者模型应用场景及优势? 什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进 ...

  10. 网络爬虫:分离生产者和消费者来优化爬虫程序

    问题描述: 基于前面的一些工作(可点击这里参见笔者前面的相关博客),我们取得了一些成果.不过存在的问题又总是会让人坐立不安.本文通过分离生产者.消费者以及引入连接池技术来优化爬虫程序.解决前面说到的数 ...

最新文章

  1. 4款基于jquery的列表图标动画切换特效
  2. 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串
  3. linux学习——大话linux网络
  4. LSGO软件技术团队与信息1402班开展真人CS活动
  5. python到包快捷键_如何最简单、通俗地理解Python的包?
  6. 20190808估值方法
  7. 大数据学长面试之华为面试题
  8. 微信小程序获取openId,传参问题导致参数无效(errcode: 40013、errcode:40125、errcode“:40029)
  9. 简单介绍JVM的GC过程
  10. android twitter第三方登录,android中接入twitter进行第三方登录
  11. shell脚本-md5码
  12. Unity导航小地图制作
  13. 刚刚,北大智能学院成立!AI视觉泰斗朱松纯教授任院长
  14. 在一个页面同时引入两个百度地图
  15. 中国地区三级联动下拉菜单
  16. 3000字梳理大数据开发流程及规范(建议收藏)
  17. oracle中start with ... connect by prior的用法(图文并茂,一看就懂!!)
  18. jiecaovideoplayer视频播放开源框架的使用步骤
  19. (附源码)计算机毕业设计ssm高校勤工助学管理系统
  20. 一文读懂马云、马化腾、李彦宏、库克等互联网大佬们都在乌镇干了啥

热门文章

  1. 怎么让上下两排对齐_为什么你家装饰画怎么挂都怪怪的?看完再装立马就能美翻了!...
  2. 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验须进行最少()次预压。A.1B.2C.3D.4...
  3. 目标检测--Accurate Single Stage Detector Using Recurrent Rolling Convolution
  4. 【numpy】协方差计算
  5. python 案例串接_来撸串,一个案例轻松认识Python 字符串——翻转拼接游戏
  6. Centos7安装Elasticsearch
  7. leetcode--笔记——120. 三角形最小路径和
  8. pandas转mysql特定列_在pandas.DataFrame.to_sql时指定数据库表的列类型
  9. java收银台程序gui_javaSE小项目---简易收银台
  10. pythonmysql数据库系统实战_Python实战之MySQL数据库操作