并行模式之生产者消费者

举报
西魏陶渊明 发表于 2022/09/25 01:48:22 2022/09/25
913 0 0
【摘要】 原理 生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过共享内存缓冲区进行通信。 生产者和消费者分开,互相不用关系 学到的只是启蒙思想,如何使...

原理

生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过共享内存缓冲区进行通信。

生产者和消费者分开,互相不用关系

学到的只是启蒙思想,如何使用,就看大家了

实现

  • 定义一个队列

  • 生产者和消费者都对该队列操作

    生产者添加内容,消费者获取内容

    逻辑:当消费完了,就等待。当添加了就唤醒,消费者


      生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过共享内存缓冲区进行通信。
  
 

消费者


      /**
      * @Package: com.consumer
      * @Description:从队列中获取参数
      * @author: liuxin
      * @date: 2017/7/11 下午5:20
      */
      public class Consumer implements Runnable {
        Container container;
        Consumer(Container container) {
            this.container = container;
         }
        public void run() {
            for(int i=1; i<20; i++) { //一共要吃20个
                try { //生成一个睡1秒,便于观察
                    Thread.sleep((long) (Math.random() * 2000));
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
                System.out.println("消费了:" + container.pop());
             }
         }
      }
  
 

生产者


      /**
      * @Package: com.consumer
      * @Description: 添加资料
      * @author: liuxin
      * @date: 2017/7/11 下午5:18
      */
      public class Product implements Runnable {
        Container container;
        Product(Container container) {
            this.container = container;
         }
        public void run() {
            for (int i = 1; i < 20; i++) { //一共要生成20个
                String wt = i + "馒头";
                 container.push(wt);
                System.out.println("生产了:" + wt);
                try { //生成一个睡1秒,便于观察
                    Thread.sleep((long) (Math.random() * 1000));
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         }
      }
  
 

测试


      public class Main {
        public static void main(String[] args) {
            //创建队列,队列中只能装5个
            Container container = new Container();
            Product product = new Product(container);
            Consumer consumer = new Consumer(container);
            new Thread(product).start();
            new Thread(consumer).start();
         }
      }
  
 

      public class Container {
        private Queue<String> queue = new ConcurrentLinkedQueue<String>();
        /**
       * 添加参数,当已经满了了, 当前线程就等待,等到消费者去消费。
       *
       * @param message
       */
        public synchronized void push(String message) {
            while (queue.size() == 5) {
                try {
                    this.wait(); //阻塞生产者
                    System.out.println("已经装满了");
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
             }
            this.notify();
             queue.add(message);
         }
        /**
       * 当已经消费完了,就等待,然后唤醒生产者去消=
       * iooooouihyzAS
       * @return
       */
        public synchronized String pop() {
            //当容器中没有了,就等待
            while (queue.size() == 0) {
                try {
                    this.wait();
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
             }
            this.notify();//唤醒生产者
            return queue.poll();
         }
      }
  
 

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/102425307

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。