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

 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. HTML——meta
  2. android support Percent支持库开发
  3. 如何修改被编译后DLL文件
  4. python3之协程(4)---gevent实现协程操作
  5. 什么是Mockito Extra接口?
  6. 汇博工业机器人码垛机怎么写_全自动码垛机器人在企业生产中的地位越来越重要...
  7. (王道408考研操作系统)第一章计算机系统概述-第一节1:操作系统基本概念以及目标和功能
  8. 图系列(一)图神经网络
  9. 前端-----今日份小练习
  10. CAD2016入门教程
  11. Vista 自动激活工具(最新 最权威 所有版本 可升级)
  12. 网站为什么要做外链?
  13. freeswitch呼叫中心之百度MRCP语音合成识别环境搭建
  14. 做完系统回来计算机连接不上网络,电脑重装win7系统后连不上网怎么办_win7重装系统连不上网如何解决...
  15. 针对Object和Array深拷贝处理
  16. x+=x-=x*x; 和 x-=x*x; x+=x;
  17. Maven学习(一)---Maven简介
  18. linux启动mysql失败,Fatal error: Can‘t open and lock privilege tables: Table ‘mysql.host‘ doesn‘t exist
  19. sql中如何添加数据
  20. 如何安装xampp(linux版)

热门文章

  1. axt测试软件,【测试工具】这些APP实用测试工具,不知道你就out了!
  2. flask_sqlalchemy 多对多重复插入解决办法
  3. 1.解决python中导入包不成功的问题(出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url问题)
  4. 人群分割--Fully Convolutional Neural Networks for Crowd Segmentation
  5. 如何改变anaconda 的 gcc 版本?
  6. LeetCode 93. Restore IP Addresses--面试算法题--Python解法
  7. java事件驱动模型_Spring事件驱动模型详解
  8. C++——新类型与原始字面量(原始字符串)
  9. 浪潮服务器开始虚拟化,(浪潮服务器-虚拟化解决方案.ppt
  10. java内存规范_Java内存模型-jsr133规范介绍