zoukankan      html  css  js  c++  java
  • 产品每生产一个消费一个

    产品每生产一个消费一个  

     

     

    从这里大家可以看出。这种模式的使用,适用于生产。来源于:生产-消费模式的升级版。我们可以理解为。没生产一完成一个工序。就需要把这个工序从新调整为原始的状态值。

     

    也可以理解为:一条流水线上多条工序,生产和消费是相对应的。那么从这个角度分析。是不是我们就可以想象为。添加和删除。修改和删除。修改和添加。这是哪个逻辑操作呢、

     

    写过工厂加工流水线的同学们大概都知道。每一条线上都有很多工序。这种模式的使用,可以添加一对多。多对多的,高并发关系使用。

     

    什么是生产消费模式。能解决什么问题呢?

    在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

    生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

    这个阻塞队列就是用来给生产者和消费者解耦的。纵观大多数设计模式,都会找一个第三者出来进行解耦,如工厂模式的第三者是工厂类,模板模式的第三者是模板类。在学习一些设计模式的过程中,如果先找到这个模式的第三者,能帮助我们快速熟悉一个设计模式。

    废话不多说直接代码走起:

    我们来看看究竟是如何生成一个。在消费一个、

     

    package com.huojg.test;
    
    //需求:产品每生产一个消费一个  
    import java.util.concurrent.locks.*;  
    public class ProducerConsumerDemo   
    {  
      public static void main(String[] args)   
      {  
          Resource r = new Resource();  
          Producer pro = new Producer(r);  
          Consumer con = new Consumer(r);  
          Thread t1 = new Thread(pro);      
          Thread t2 = new Thread(con);        
          t1.start();  
          t2.start();  
      }  
    }  
    class Resource  
    {  
      private String name;  
      private int count = 1;  
      private boolean flag = false;  
      Lock lock=new ReentrantLock();  
      Condition pro = lock.newCondition();  
      Condition con = lock.newCondition();  
      public void set(String name)  
      {  
          lock.lock();  
          while(flag)  
             try{pro.await();}catch(Exception e){}  
          this.name = name+"--"+count++;  
          System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);  
          flag = true;  
          con.signalAll();  
          lock.unlock();  
      }  
      public void out()  
      {  
          lock.lock();  
          while(!flag)  
              try{con.await();}catch(Exception e){}  
          System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);  
          flag = false;  
          pro.signalAll();  
          lock.unlock();  
      }  
    }  
    
    class Producer implements Runnable  
    {  
      private Resource res;  
    
      Producer(Resource res)  
      {  
          this.res = res;  
      }  
      public void run()  
      {  
          while(true)  
          {  
              res.set("+商品+");  
          }  
      }  
    }  
    
    class Consumer implements Runnable  
    {  
      private Resource res;  
    
      Consumer(Resource res)  
      {  
          this.res = res;  
      }  
      public void run()  
      {  
          while(true)  
          {  
              res.out();  
          }  
      }  
    }  

    结果运行:

    Thread-1...消费者.........+商品+--14325
    Thread-0...生产者..+商品+--14326
    Thread-1...消费者.........+商品+--14326
    Thread-0...生产者..+商品+--14327
    Thread-1...消费者.........+商品+--14327
    Thread-0...生产者..+商品+--14328
    Thread-1...消费者.........+商品+--14328
    Thread-0...生产者..+商品+--14329
    Thread-1...消费者.........+商品+--14329
    Thread-0...生产者..+商品+--14330
    Thread-1...消费者.........+商品+--14330
    Thread-0...生产者..+商品+--14331
    Thread-1...消费者.........+商品+--14331
    Thread-0...生产者..+商品+--14332
    Thread-1...消费者.........+商品+--14332
    Thread-0...生产者..+商品+--14333
    Thread-1...消费者.........+商品+--14333
    Thread-0...生产者..+商品+--14334
    Thread-1...消费者.........+商品+--14334
    Thread-0...生产者..+商品+--14335
    Thread-1...消费者.........+商品+--14335
    Thread-0...生产者..+商品+--14336
    Thread-1...消费者.........+商品+--14336
    Thread-0...生产者..+商品+--14337
    Thread-1...消费者.........+商品+--14337
    Thread-0...生产者..+商品+--14338
    Thread-1...消费者.........+商品+--14338
    Thread-0...生产者..+商品+--14339
    Thread-1...消费者.........+商品+--14339
    Thread-0...生产者..+商品+--14340

    概述:经过这个段代码可以让你很明白的知道。生产者和消费者如何去使用。如何解决问题。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    git/github 常用操作
    Ubuntu sudoer文件改错补救方法!
    Linux Expect 用法
    Linux/Ubuntu sudo不用输入密码的方法
    CTest 简介
    Linux下命令行设置ip和掩码, 网关
    Ubuntu1804下安装gdb与使用
    Linux bash 文本处理命令awk,sed,grep 用法
    Yii 判断是不是post方式提交的数据
    VS2017 CMake配置
  • 原文地址:https://www.cnblogs.com/huojg-21442/p/7119614.html
Copyright © 2011-2022 走看看