JAVA多线程关于消费者/生产者的设计模式

  1 import javax.swing.plaf.SliderUI;
  2
  3 /*
  4  * 生产者Producter
  5  * 仓库Godown
  6  * 消费者    Consumer
  7  * 生产者和消费者通过仓库而建立起联系,仓库的当前数量低于最大库存量时,生产者线程不断生产产品(修改Godown类的属性的值)
  8  * 仓库的产品数量大于0时,消费者不断取出产品(修改Godown类的属性的值).当生产者生产的产品等于最大库存值时,
  9  * 停止生产,当产品数量小于0时,消费者停止消费
 10  *
 11  *         分析:
 12  *             1涉及到多线程:生产者和消费者,并且可能有多个生产者和多个消费者
 13  *             2涉及数据共享:仓库的产品数量会被多个生产者和消费者共同操作
 14  *                         生产者与生产者的同步 生产者与消费者的同步  消费者与消费者的同步(synchronized)
 15  *             3涉及到线程的通讯:生产者与消费者的通讯(wait和notify)
 16  */
 17
 18 public class ThreadDemo {
 19
 20     /**
 21      * @param args
 22      */
 23     public static void main(String[] args) {
 24         Godown godown = new Godown();        //创建一个产品仓库
 25         Consumer cs = new Consumer(godown);    //创建消费者目标对象并使消费者共享该仓库
 26         Producter pd = new Producter(godown);//创建生产者目标对象并使其共享该仓库
 27         Thread tr1 = new Thread(pd);        //创建一个生产者线程
 28         Thread tr2 = new Thread(pd);        //创建第二个生产者线程
 29         Thread tr3 = new Thread(cs);        //创建一个消费者线程
 30         tr1.setName("一号生产者线程");            //修改线程名称
 31         tr2.setName("二号生产者线程");
 32         tr3.setName("一号消费者者线程");
 33         tr1.start();                        //启动线程
 34         tr2.start();
 35         tr3.start();
 36
 37     }
 38
 39
 40 }
 41 /*
 42  * 消费者
 43  */
 44 class Consumer implements Runnable{
 45     private Godown godown;
 46     private Boolean boolea = true;
 47     public Consumer(Godown godown){
 48         this.godown = godown;
 49     }
 50     @Override
 51     public void run() {            //不断的取出产品
 52         while(boolea){
 53             godown.Consumption();
 54         }
 55
 56     }
 57 }
 58     /*
 59      * 生产者
 60      */
 61 class Producter implements Runnable{
 62
 63     private Godown godown;
 64     private Boolean boolea = true;
 65     public Producter(Godown godown){
 66         this.godown = godown;
 67     }
 68     @Override
 69     public void run() {
 70         while(boolea){        //不断的生产产品
 71             godown.Production();
 72         }
 73
 74     }
 75
 76 }
 77
 78 class Godown{
 79     public static final int max_size = 100; //最大库存量
 80     public int curnum; //当前库存量默认为0
 81     public synchronized void Production(){            //生产产品
 82         if(curnum<max_size){        //如果满足生产条件则开始生产
 83             curnum++;
 84             notify();//生产了产品后通知休眠进程可以工作了(如果唤醒的是别的生产线程,因为共同的对象锁此时处于锁定状态,
 85                     //所以被唤醒的生产线程会阻塞,如果唤醒的是消费者线程,则消费者线程开始工作)
 86             System.out.println(Thread.currentThread().getName()+"生产一个产品   当前剩余产品数量: "+curnum);
 87             try {
 88                 Thread.currentThread().sleep(250);    //控制生产的速度
 89
 90             } catch (InterruptedException e) {
 91                 e.printStackTrace();
 92             }
 93         }else{
 94
 95             try {
 96                 wait();        //不满足生产条件时,生产者线程释放当前的对象锁,进入休眠状态
 97             } catch (InterruptedException e) {
 98                 e.printStackTrace();
 99             }
100         }
101     }
102     public synchronized void Consumption(){
103         if(curnum>0){
104
105             notify();
106             curnum--;
107             System.out.println(Thread.currentThread().getName()+"消费一个产品   当前剩余产品数量: "+curnum);
108             try {
109                 Thread.currentThread().sleep(300);
110
111             } catch (InterruptedException e) {
112
113                 e.printStackTrace();
114             }
115         }else{
116             try {
117                 wait();
118             } catch (InterruptedException e) {
119
120                 e.printStackTrace();
121             }
122
123         }
124     }
125 }
时间: 2024-10-15 00:34:48

JAVA多线程关于消费者/生产者的设计模式的相关文章

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

/*@author shijin * 生产者与消费者模型中,要保证以下几点: * 1 同一时间内只能有一个生产者生产     生产方法加锁sychronized * 2 同一时间内只能有一个消费者消费     消费方法加锁sychronized * 3 生产者生产的同时消费者不能消费     生产方法加锁sychronized * 4 消费者消费的同时生产者不能生产     消费方法加锁sychronized * 5 共享空间空时消费者不能继续消费     消费前循环判断是否为空,空的话将该线程

java多线程 生产消费者模型

[seriesposts sid=500] 下面的代码讲述了一个故事 一个面包生产铺里目前有30个面包,有三个人来买面包,第一个人要买50个,第二个要买20个,第三个要买30个. 第一个人不够,所以等着,让第二个买了.面包铺继续生产面包.有7个人在生产. package com.javaer.thread; public class CPMode { public static void main(String[] args) { Godown godown = new Godown(30);

java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样,先定义一个缓冲区: public class ValueObject { public static String value = ""; } 换种写法,生产和消费方法放在一个类里面: public class ThreadDomain41 extends ReentrantLock {

java多线程(二)——用到的设计模式

接上篇:java多线程(一)http://www.cnblogs.com/ChaosJu/p/4528895.html java实现多线程的方式二,实现Runable接口用到设计模式——静态代理模式 一.代理模式 代理模式的定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用. 代理模式不会改变原来的接口和行为,只是转由代理干某件事,代理可以控制原来的目标,例如:代理商,代理商只会卖东西,但并不会改变行为,不会制造

[Java基础] java多线程关于消费者和生产者

多线程: 生产与消费1.生产者Producer生产produce产品,并将产品放到库存inventory里:同时消费者Consumer从库存inventory里消费consume产品.2.库存inventory的总量(最大库存量100)是有限的.如果库存inventory满了,生产者不能在库存inventory继续生产produce产品,须等待状态.等待产品被消费者Consumer消费consume了,再往库存inventory生产produce产品.3.若库存inventory空了,消费者Co

java多线程中的生产者与消费者之等待唤醒机制@Version1.0

一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notifyAll():唤醒所有线程2.为什么这些方法不定义在Thread类中呢?  这些方法的调用必须通过锁对象调用,而我们刚才使用的锁对象是任意锁对象.  所以,这些方法必须定义在Object类中.3.当我们在使用多线程的时候有的时候需要,一条线程产生一个数据,另一条线程接着消费一个数据,一边生产一边消费,

java多线程--“朴素版”生产者消费者问题

1. 生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括"生产者"."消费者"."仓库"和"产品".他们之间的关系如下: (01) 生产者仅仅在仓储未满时候生产,仓满则停止生产. (02) 消费者仅仅在仓储有产品时候才能消费,仓空则等待. (03) 当消费者发现仓储没产品可消费时候会通知生产者生产. (04) 生产者在生产出可消费产品时候,应该通知等待的消费者去消费. 2. 生产/消费者实现 下面通过

java多线程中的生产者与消费者之等待唤醒机制@Version2.0

二.生产者消费者模式的学生类成员变量生产与消费demo, @Version2.0 在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者 最终版的代码中: 把student的成员变量给私有化了, 把设置和获取的功能给封装成了功能,并加了同步, 设置或者获取的线程里面只需要调用方法即可. 1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notifyAll():唤醒所

Java多线程与并发——生产者与消费者应用案例

多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Administrator * */ public class ThreadDemo4 { public static void main(String[] args) { // TODO 自动生成的方法存根 Food food=new Food(); Producter p=new Producter(fo