生产者与消费者模式

  1 准确说应该是生产者(setter)-消费者(getter)-仓储模型,离开了仓储,生产者消费者模型就显得没有说服
  2                  力了。
  3         >实现代码:
  4
  5             //1. 实体设计:同步栈仓储,共享数据域
  6             class SyncStack{
  7
  8                 //同步栈仓储中的数据产品,默认为10个大小
  9                 private String[] products=new String[10];
 10                 //数据产品数据的下标索引,初始化为0
 11                 private int index=0;
 12
 13                 //setter,方法名为push,压栈
 14                 //同步保证了只有对象只有一个线程占用
 15                 public synchronized void push(String sst){
 16                     //如果数据数组的下标递增到10(产品数据中的默认大小)
 17                     if(index==procucts.length){
 18                         try{
 19                             //线程阻塞,等待唤醒,释放自己的锁,使其他线程有机会获得
 20                             //对象的锁
 21                             wait();
 22                         }catch(InterruptedException e){
 23                             //打印错误踪迹
 24                             e.printStackTrace();
 25                         }
 26                     }
 27                     //当数组还未满10个对象时,唤醒在此监视器上等待的单个线程
 28                     this.notify();
 29                     //设值
 30                     products[index]=sst;
 31
 32                     index++;
 33                 }
 34
 35                 //getter,方法名为getPro,获取产品数组
 36                 public String[] getPro(){
 37                     return this.products;
 38                 }
 39
 40                 //delete,方法名为pop,弹栈
 41                 public String pop(){
 42                     if(index==0){
 43                         try{
 44                             wait();
 45                         }catch(InterruptedException e){
 46                             e.printStackTrace();
 47                         }
 48
 49                     }
 50                     this.notify();
 51                     //获取栈顶的元素
 52                     String product=products[index];
 53                     index--;
 54                     return product;
 55                 }
 56
 57             }
 58
 59             //2. 实体设计:生产者
 60             class Producer implements Runnable{
 61
 62                 //依赖同步栈的数据域
 63                 private SyncStack stack;
 64                 //setter,用构造函数进行设置值
 65                 public Producer(SyncStack stack){
 66                     this.stack=stack;
 67                 }
 68
 69                 //覆写运行的方法
 70                 public void run(){
 71                     //循环的往数据域里塞值
 72                     for(int i=0;i<stack.getPro().length;i++){
 73                         String product="产品"+i;
 74                         stack.push(product);
 75                         syso("生产了"+product);
 76                     }
 77                     try{
 78                         //线程睡眠1秒
 79                         Thread.sleep(1000);
 80                     }catch(InterruptedExcetion e){
 81                         e.printStackTrace();
 82                     }
 83
 84                 }
 85             }
 86
 87             //3. 实体设计:消费者
 88             classs Consumer implements Runnable{
 89
 90                 //依赖同步栈的数据域
 91                 private SyncStack stack;
 92                 //setter,用构造函数进行设置值
 93                 public Consumer(SyncStack stack){
 94                     this.stack=stack;
 95                 }
 96
 97                 //覆写运行的方法
 98                 public void run(){
 99                     //循环的在数据域弹值
100                     for(int i=0;i<stack.getPro().length;i++){
101                         String product=stack.pop();
102                         syso("消费了"+product);
103                     }
104                     try{
105                         //线程睡眠1秒
106                         Thread.sleep(1000);
107                     }catch(InterruptedExcetion e){
108                         e.printStackTrace();
109                     }
110             }
111
112
113             //4. 主方法,轮片调用生产者和消费者线程
114             public class ProCon{
115
116                 //创建数据共享域,即数据的仓储
117                 SyncStack stack=new SynnStack();
118
119                 //以同步栈即共享数据的仓储为参数创建生产者
120                 Producer producer=new Producer(stack);
121                 //以同步栈即共享数据的仓储为参数创建消费者
122                 Consumer consuner=new Consumer(stack);
123
124                 //创建生产者线程之后使线程为就绪状态
125                 new Thread(producer).start();
126                 //创建消费者之后使线程为就绪状态
127                 new Thread(consumer).start();
128             }
时间: 2024-08-09 22:04:19

生产者与消费者模式的相关文章

同步函数 生产者和消费者模式 加强版(多人生产和多人消费)

曾经搞了半天, 生产者和消费者模式  加强版(多人生产 多人消费 ).. 以前的代码格式就不再吐槽了(以后努力改进) //输出结果是一个无限循环 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 多个生产者&多个消费者模式 * 多个生产者不断生产,多个消费者不停的消费

多线程生产者、消费者模式中,如何停止消费者?多生产者情况下对“毒丸”策略的应用。

生产者.消费者模式是多线程中的经典问题.通过中间的缓冲队列,使得生产者和消费者的速度可以相互调节. 对于比较常见的单生产者.多消费者的情况,主要有以下两种策略: 通过volatile boolean producerDone =false 来标示是否完成.生产者结束后标示为true, 消费者轮询这个变量来决定自己是否退出. 这种方式对producerDone产生比较大的争用,实现起来也有诸多问题需要考虑. 比较经典的"毒丸"策略,生产者结束后,把一个特别的对象:"毒丸&quo

Linux:生产者与消费者模式

生产者:生产数据 消费者:消费数据 提供场所:缓冲区,eg:超市 生产者消费者特点:三种关系,两类人,一个场所 三种关系指的是:生产者与生产者之间是互斥关系 消费者与消费者之间是互斥关系 生产者与消费者之间是同步与互斥关系 两类人:生产者,消费者 一个场所:存储数据(此处用带头单链表实现) 单生产者单消费者模式:此例取数据方式为FIFO先进先出. 利用互斥锁实现单生产者单消费者模式. #include<stdio.h> #include<malloc.h> #include<

生产者与消费者模式(线程的同步与互斥)

死锁产生的四个条件: 1.互斥使用(资源独占) 一个资源每次只能给一个进程使用 .2.不可强占(不可剥夺) 资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放 .3.请求和保持(部分分配,占有申请) 一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配) .4.循环等待 存在一个进程等待队列 {P1 , P2 , - , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,-,Pn等待P1占有的资源,形成一个进程等待环路 生产者:生产数据

Java多线程设计模式(2)生产者与消费者模式

1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不匹配. 当要从某个线程Produccer参与者将数据传输给其它线程Consumer参与者的时候,此时就可以在中间加一个Channel参与者,在Channel参与者中以某种方式存放接受的数据,再以某方式来获取收到的数据,Channel就可以来缓存两个线程之间传输的数据,在Channel参与者为了保证安

python实现生产者和消费者模式

利用python的线程实现简单生产者和消费者模式,这种模式在多线程编程时还是用的比较多吧,下面是源代码: 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 import requests,time 4 import threading,queue 5 6 7 class mythread_1(threading.Thread): 8 def __init__(self,queue): 9 super(mythread_1,self).__init__

python 生产者与消费者模式

生产者与消费者模式 1. 队列 先进先出 2. 栈 先进后出 Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语(可以理解为原子操作,即要么不做,要么就做完),能够在多线程中直接使用.可以使用队列来实现线程间的同步. 用FIFO队列实现上述生产者与消费者问题的代码如下: import threading import time from q

Java并发编程(4)--生产者与消费者模式介绍

一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就先消费直至消费完成:而生产者每天的工作就是先检测仓库是否有库存,如果没有就开始生产,满仓了就停止生产等待消费,直至工作结束.下图是根据假象画的流程图: 那么在程序中怎么才能达到这样的效果呢?下面介绍三种方式实现. 二.使用notify() 和 wait()实现 相信大家这两个方法都不陌生,它是Obj

实现生产者与消费者模式

实现生产者与消费者模式 目录 生产者与消费者模式 实现 生产者与消费者模式 什么是生产者消费者模式 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力. 这个阻塞队列就是用来给生产者和消费者解耦的.纵观大多数设计模式,都会找一个第三者出来进行解耦,如工厂模式

多线程之生产者和消费者模式

package com.git.base.thread.productandconsumer; /** * 核心实现: * 生产者消费者模式: * 生产一个,消费一个,如果生产未被消费,那么就等待消费后再生产 * 如果消费后,没有下一个生产的,就等待生产后在消费 * <p>Title: DoMain.java</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2016</p&g