日期:2014-05-20  浏览次数:20681 次

写了个生产者与消费者。请大家指点
不知道写的对不对,望大家指点


1、代码

package com.jh.java.thread;


/**
 * 模拟场景:
 * 
 * 生产者和消费者模式
 * 库存为0,首先开始生产,最大库存为100。库存将满时 开始消费。
 * 消费到库存 不够时  则扩大再生产。
 * 如此反复
 * @author JIHAN
 *
 */
public class MyTest3 {


public static void main(String[] args) {
Storehouse house = new Storehouse();

new Thread(new Producer(house)).start();
new Thread(new Consumer(house)).start();
}
}

/**
 * 仓库
 * @author JIHAN
 *
 */
class Storehouse{

private int stockMax = 100;

private int stock = 0;

public synchronized void produce(int i) {

if(stock+i >stockMax) {
System.out.println("警告: 若生产" + i + "个,库存"+stock+"  将已满。。。暂停生产 。。。 ");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
stock += i;
System.out.println(Thread.currentThread().getName() + " 生产 " + i + "个, 当前库存 " + stock);

notifyAll();
}

public synchronized void con(int i) {

if(stock+i < 0) {
System.out.println("警告: 若消费" + i + "个,库存"+stock+"将不够。。。。需生产 。。。 稍等。。。 ");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

stock += i;
System.out.println(Thread.currentThread().getName() + " 消费 " + i + "个, 当前库存 " + stock);
notifyAll();
}
}


/**
 * 生产者
 * @author JIHAN
 *
 */
class Producer implements Runnable{

private Storehouse storehouse;

public Producer(Storehouse storehouse) {
this.storehouse = storehouse;
}

public void run() {
while(true) {
storehouse.produce((int)(Math.random()*10));
}
}

}

class Consumer implements Runnable{

private Storehouse storehouse;

public Consumer(Storehouse storehouse) {
this.storehouse = storehouse;
}

public void run() {
while(true) {
storehouse.con(-(int)(Math.random()*10));
}
}
}



2、结果:


 

Thread-0 生产 2个, 当前库存 87
Thread-0 生产 0个, 当前库存 87
Thread-0 生产 4个, 当前库存 91
Thread-0 生产 7个, 当前库存 98
Thread-0 生产 0个, 当前库存 98
警告: 若生产3个,库存98  将已满。。。暂停生产 。。。 
Thread-1 消费 -5个, 当前库存 93
Thread-1 消费 -1个, 当前库存 92
Thread-1 消费 -4个, 当前库存 88
Thread-1 消费 -6个, 当前库存 82
Thread-1 消费 -3个, 当前库存 79
Thread-1 消费 -2个, 当前库存 77
Thread-1 消费 -5个, 当前库存 72
Thread-1 消费 -3个, 当前库存 69
Thread-1 消费 -9个, 当前库存 60
Thread-1 消费 -6个, 当前库存 54
Thread-1 消费 -7个, 当前库存 47
Thread-1 消费 -2个, 当前库存 45
Thread-1 消费 -3个, 当前库存 42
Thread-1 消费 -9个, 当前库存 33
Thread-1 消费 -7个, 当前库存 26
Thread-1 消费 -5个, 当前库存 21
Thread-1 消费 -3个, 当前库存 18
Thread-1 消费 -4个, 当前库存 14
Thread-1 消费 -7个, 当前库存 7
Thread-1 消费 -7个, 当前库存 0
警告: 若消费-6个,库存0将不够。。。。需生产 。。。 稍等。。。 
Thread-0 生产 3个, 当前库存 3
Thread-0 生产 1个, 当前库存 4
Thread-0 生产 6个, 当前库存 10
Thread-0 生产 9个, 当前库存 19
Thread-0 生产 6个, 当前库存 25
Thread-0 生产 7个, 当前库存 32
Thread-0 生产 1个, 当前库存 33
Thread-0 生产 7个, 当前库存 40
Thread-0 生产 1个, 当前库存 41
Thread-0 生产 8个, 当前库存 49
Thread-0 生产 6个, 当前库存 55
Thread-0 生产 0个, 当前库存 55
Thread-0 生产 9个, 当前库存 64
Thread-0 生产 3个, 当前库存 67
Thread-0 生产 7个, 当前库存 74
Thread-0 生产 4个, 当前库存 78
Thread-0 生产 4个, 当前库存 82
Thread-0 生产 9个, 当前库存 91
Thread-0 生产 1个, 当前库存 92
Thread-0 生产 0个, 当前库存 92
Thread-0 生产 7个, 当前库存 99
警告: 若生产3个,库存99  将已满。。。暂停生产 。。。 
Thread-1 消费 -6个, 当前库存 93
Thread-1 消费 -9个, 当前库存 84
Thread-1 消费 -4个, 当前库存 80
Thread-1 消费 -3个, 当前库存 77
Thread-1 消费 -6个, 当前库存 71
Thread-1 消费 0个, 当前库存 71
Thread-1 消费 -4个, 当前库存 67