并行模式之生产者消费者

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

原理

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

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

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

实现

  • 定义一个队列

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

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

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


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

消费者


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

生产者


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

测试


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

  
  1. public class Container {
  2. private Queue<String> queue = new ConcurrentLinkedQueue<String>();
  3. /**
  4. * 添加参数,当已经满了了, 当前线程就等待,等到消费者去消费。
  5. *
  6. * @param message
  7. */
  8. public synchronized void push(String message) {
  9. while (queue.size() == 5) {
  10. try {
  11. this.wait(); //阻塞生产者
  12. System.out.println("已经装满了");
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. this.notify();
  18. queue.add(message);
  19. }
  20. /**
  21. * 当已经消费完了,就等待,然后唤醒生产者去消=
  22. * iooooouihyzAS
  23. * @return
  24. */
  25. public synchronized String pop() {
  26. //当容器中没有了,就等待
  27. while (queue.size() == 0) {
  28. try {
  29. this.wait();
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. this.notify();//唤醒生产者
  35. return queue.poll();
  36. }
  37. }

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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