• 生产者消费者程序


    package learnJava_Thread;
    /**
    *
    *
    @author wrh
    * 2011/12/06
    * use multithread to complete producer and consumer problem
    */

    public class TestProducer_Consumer {
    public static void main(String[] args) {
    GoDown goDown = new GoDown(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 curiNum; //当前库存量

    GoDown() {

    }

    GoDown(int curNum) {
    this.curiNum = curNum;
    }

    /**
    * 生产指定数量的产品
    *
    @param needNum;
    */

    public synchronized void produce(int needNum) {
    //测试是否需要生产
    while (needNum + curiNum > Max_Size){

    System.out.println("要生产的数量已经超过仓库最大容量,暂时不能执行生产任务");
    try {
    //当前生产线程等待
    wait();


    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }

    //满足生产条件,则进行生产,这里简单的更改但却库存量
    curiNum += needNum;

    System.out.println("已经生产了"+ needNum +"件产品,现在仓库的额容量为:" + curiNum);
    notifyAll();
    }

    /**
    * 消费指定数量的产品
    *
    @param needNum
    *
    */

    public synchronized void consume(int needNum) {
    //测试是否可消费
    while (curiNum < needNum) {

    try {
    //当前生产线程等待
    wait();

    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }

    //满足消费条件,则进行消费,这事简单的更改当前库存量
    curiNum -= needNum;

    System.out.println("已经消费了"+ needNum + "个产品");
    notifyAll();
    }

    }

    /**
    * 生产者
    *
    */

    class Producer extends Thread {
    private int needNum; //生产产品的数量
    private GoDown goDown; //仓库

    Producer(int needNum, GoDown goDown) {
    this.goDown = goDown;
    this.needNum = needNum;
    }

    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);

    }
    }
    说明:
    对于本例,要说明的是当发现不能满足生产或者消费条件的时候,调用对象的wait方法,wait方法的作用是释放当前线程的所获得的锁,并调用对象的notifyAll() 方法,通知(唤醒)该对象上其他等待线程,使得其继续执行。这样,整个生产者、消费者线程得以正确的协作执行。
    notifyAll() 方法,起到的是一个通知作用,不释放锁,也不获取锁。只是告诉该对象上等待的线程“可以竞争执行了,都醒来去执行吧”。
     
    本例仅仅是生产者消费者模型中最简单的一种表示,本例中,如果消费者消费的仓储量达不到满足,而又没有生产者,则程序会一直处于等待状态,这当然是不对的。实际上可以将此例进行修改,修改为,根据消费驱动生产,同时生产兼顾仓库,如果仓不满就生产,并对每次最大消费量做个限制,这样就不存在此问题了,当然这样的例子更复杂,更难以说明这样一个简单模型。


    本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/221932
  • 相关阅读:
    矩阵乘法与邻接矩阵
    矩阵加速 学习笔记
    P5596 【XR-4】题
    P1842 奶牛玩杂技
    CF449B Jzzhu and Cities
    小球与盒子
    [JZOJ5279]香港记者题解--最短路图
    [学习笔记]二分图匹配与匈牙利算法
    [NOIP2018模拟赛10.25]瞎搞报告
    luogu2657-Windy数题解--数位DP
  • 原文地址:https://www.cnblogs.com/wrh526/p/2278534.html
Copyright © 2020-2023  润新知