zoukankan      html  css  js  c++  java
  • 生产者与消费者-N:N-基于list

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

      

     1 /**
     2  *    生产者
     3  */
     4 public class P {
     5     private MyStack stack;
     6     
     7     public P(MyStack stack) {
     8         this.stack = stack;
     9     }
    10     
    11     public void pushService() {
    12         stack.push();
    13     }
    14 }
     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 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 /**
     5  *    模拟栈
     6  */
     7 public class MyStack {
     8     private List<Object> list = new ArrayList<>();
     9     
    10     public synchronized void push() {
    11         try {
    12             while(list.size() == 1) {
    13                 this.wait();
    14             }
    15             list.add(""+Math.random());
    16             this.notifyAll();
    17             System.out.println("push:" + list.size());
    18         } catch (InterruptedException e) {
    19             e.printStackTrace();
    20         }
    21     }
    22     
    23     
    24     public synchronized String pop() {
    25         String value = "";
    26         try {
    27             while(list.size() == 0) {
    28                 System.out.println("pop 操作中:" + Thread.currentThread().getName() + "wait状态");
    29                 this.wait();
    30             }
    31             value = ""+list.get(0);
    32             list.remove(0);
    33             this.notifyAll();
    34             System.out.println("pop:" + list.size());
    35         } catch (InterruptedException e) {
    36             e.printStackTrace();
    37         }
    38         return value;
    39     }
    40 }
     1 /**
     2  *    生产者线程
     3  */
     4 public class P_Thread extends Thread {
     5     private P p;
     6     
     7     public P_Thread(P p) {
     8         this.p = p;
     9     }
    10     
    11     @Override
    12     public void run() {
    13         while (true) {
    14             p.pushService();
    15         }
    16     }
    17 }
     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     public static void main(String[] args) {
     6         MyStack stack = new MyStack();
     7         //三个生产者
     8         P p1 = new P(stack);
     9         P p2 = new P(stack);
    10         P p3 = new P(stack);
    11         //三个消费者
    12         C c1 = new C(stack);
    13         C c2 = new C(stack);
    14         C c3 = new C(stack);
    15         
    16         //三个生产者线程
    17         P_Thread pThread1 = new P_Thread(p1);
    18         P_Thread pThread2 = new P_Thread(p2);
    19         P_Thread pThread3 = new P_Thread(p3);
    20         
    21         //三个消费者线程
    22         C_Thread cThread1 = new C_Thread(c1);
    23         C_Thread cThread2 = new C_Thread(c2);
    24         C_Thread cThread3 = new C_Thread(c3);
    25         
    26         //启动
    27         pThread1.start();
    28         pThread2.start();
    29         pThread3.start();
    30         cThread1.start();
    31         cThread2.start();
    32         cThread3.start();
    33     }
    34 }

    运行结果:

      

  • 相关阅读:
    boost test学习(二)
    log4cxx的使用(2)
    Windows CE下流驱动的动态加载
    linux powerqorpp1010rdb 编译过程
    cadence allegro 设计重用
    Linux中VMware虚拟机硬盘空间扩大方法
    WINCE系统启动直接运行自己的程序
    linux6410触摸屏驱动
    cadence allegro和ad9之间的转换
    wince 6.0和5.0的区别
  • 原文地址:https://www.cnblogs.com/wang1001/p/9566480.html
Copyright © 2011-2022 走看看