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); //初始化库存 30个食物
                Consumer c1 = new Consumer(50, godown);
                Consumer c2 = new Consumer(20, godown);
                Consumer c3 = new Consumer(30, godown);

                Producer p1 = new Producer(10, godown);
                Producer p2 = new Producer(10, godown);
                Producer p3 = new Producer(10, godown);
                Producer p4 = new Producer(10, godown);
                Producer p5 = new Producer(10, godown);
                Producer p6 = new Producer(10, godown);
                Producer p7 = new Producer(80, godown);
                c1.start();
                c2.start();
                c3.start();
                p1.start();
                p2.start();
                p3.start();
                p4.start();
                p5.start();
                p6.start();
                p7.start();
        }
} 

/**
* 仓库
*/
class Godown {
        public static final int max_size = 100; //最大库存量
        public int curnum;     //当前库存量 

        Godown() {
        } 

        Godown(int curnum) {
                this.curnum = curnum;
        } 

        /**
         * 生产指定数量的产品
         *
         * @param neednum
         */
        public synchronized void produce(int neednum) {
                //测试是否需要生产
                while (neednum + curnum > max_size) {
                        System.out.println("要生产的产品数量" + neednum + "超过剩余库存量" + (max_size - curnum) + ",暂时不能执行生产任务!");
                        try {
                                //当前的生产线程等待
                                wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                //满足生产条件,则进行生产,这里简单的更改当前库存量
                curnum += neednum;
                System.out.println("已经生产了" + neednum + "个产品,现仓储量为" + curnum);
                //唤醒在此对象监视器上等待的所有线程
                notifyAll();
        } 

        /**
         * 消费指定数量的产品
         *
         * @param neednum
         */
        public synchronized void consume(int neednum) {
                //测试是否可消费
                while (curnum < neednum) {
                        try {
                                //当前的消费线程等待
                                wait();
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
                //满足消费条件,则进行消费,这里简单的更改当前库存量
                curnum -= neednum;
                System.out.println("已经消费了" + neednum + "个产品,现仓储量为" + curnum);
                //唤醒在此对象监视器上等待的所有线程
                notifyAll();
        }
} 

/**
* 生产者
*/
class Producer extends Thread {
        private int neednum;                //生产产品的数量
        private Godown godown;            //仓库 

        Producer(int neednum, Godown godown) {
                this.neednum = neednum;
                this.godown = godown;
        } 

        public void run() {
                //生产指定数量的产品
                godown.produce(neednum);
        }
} 

/**
* 消费者
*/
class Consumer extends Thread {
        private int neednum;                //生产产品的数量
        private Godown godown;            //仓库 

        Consumer(int neednum, Godown godown) {
                this.neednum = neednum;
                this.godown = godown;
        } 

        public void run() {
                //消费指定数量的产品
                godown.consume(neednum);
        }
}

已经消费了20个产品,现仓储量为10
已经生产了10个产品,现仓储量为20
已经生产了10个产品,现仓储量为30
已经生产了10个产品,现仓储量为40
已经生产了10个产品,现仓储量为50
已经消费了30个产品,现仓储量为20
已经生产了80个产品,现仓储量为100
已经消费了50个产品,现仓储量为50
已经生产了10个产品,现仓储量为60
已经生产了10个产品,现仓储量为70
首发于http://java-er.com - http://java-er.com/blog/java-thread-consumer/

看了不后悔,学习编程的八个建议
你会遇到的30个JAVA面试题
俄罗斯方块设计原理
Android教程二:Android 工程文件说明大全
java高性能编程的26个注意事项
一位外国网赚达人的五个写博客建议

java多线程 生产消费者模型,布布扣,bubuko.com

时间: 2024-08-01 06:31:07

java多线程 生产消费者模型的相关文章

Java 多线程系列2——多线程的生命周期及生产消费者模型

一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了.主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态.处于就绪状态的线程,只是说

[golang]单向channel的应用“生产消费者模型”

单向channel应用"生产消费者模型" 单向channel最典型的应用是"生产者消费者模型" 所谓"生产者消费者模型": 某个模块(函数等)负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.协程.线程.进程等).产生数据的模块,就形象地称为生产者:而处理数据的模块,就称为消费者. 单单抽象出生产者和消费者,还够不上是生产者/消费者模型.该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介.生产者把数据放入

Java完成生产者消费者模型

生产者和消费者模型,是多线程中的典型模型,这里使用Java完成该模型 ServerTest.java 生产者代码 package com.orange.threadmodel; import java.util.Queue; public class ServerTest implements Runnable{ private Queue<String> queue; public ServerTest(Queue<String> queue){ this.queue = que

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

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

[多线程] 生产者消费者模型的BOOST实现

说明 如果 使用过程中有BUG 一定要告诉我:在下面留言或者给我邮件(sawpara at 126 dot com) 使用boost::thread库来实现生产者消费者模型中的缓冲区! 仓库内最多可以存放 capacity 个产品. 条件变量 condition_put 标记是否可以往仓库中存放一个产品. 条件变量 condition_get 标记是否可以从仓库中取出一个产品. 互斥量 mutexer 用于保证当前仓库只有一个线程拥有主权. 实现 #include <queue> #inclu

多线程,生产者消费者模型(生产馒头,消费馒头)

先建立一个容器 /** * 容器 * 共享资源 * @author Administrator * */ public class SynStack { int index = 0; //容器 SteamBread[] stb = new SteamBread[6]; /** * 往容器中放产品 */ public synchronized void push(SteamBread st){ while(index == stb.length){ try { this.wait(); } cat

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

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

Java多线程-并发编程模型

以下内容转自http://ifeve.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E6%A8%A1%E5%9E%8B/: 并发系统可以采用多种并发编程模型来实现.并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业.不同的并发模型采用不同的方式拆分作业,同时线程间的协作和交互方式也不相同.这篇并发模型教程将会较深入地介绍目前(2015年,本文撰写时间)比较流行的几种并发模型. 并发模型与分布式系统之间的相似性 本文所描述的并发模型类似于分布式系统中使

简单的生产消费者模型

案例场景:httpclient4.3.5抓取网页,用自带的线程池进行多线程测试. httpclient4.3.5简单介绍:对于同一主机的请求,会保存路由信息,下次的请求会根据保存的路由走,减少了查找主机的时间. 类介绍:数据结构用的阻塞队列结构:监控线程.生产线程.消费线程 代码如下: import java.io.IOException; import java.util.Random; import java.util.concurrent.LinkedBlockingQueue; impo