例子用java多線程模擬生產者消費者的例子,上代碼,代碼有註釋說的清楚:
倉庫
package day5;
/**
* <p>Title: Warehouse.java</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2014</p>
* @author 雪含心
* @date 2014年2月7日
*/
public class Warehouse {
private int MAXNUM = 100;
private int currentCount;
public Warehouse(int i) {
this.currentCount = i;
}
/**
* 生產者
* @param neednum
*/
public synchronized void produce(int neednum){
// 噹噹前的數量和生產的數量大於倉庫容量時等待消費
while (currentCount + neednum > MAXNUM) {
try {
System.out.println("要生產的產品" + neednum + "個產品,超過倉庫最大值" + MAXNUM);
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
currentCount += neednum;
System.out.println("已經生產了" + neednum + "個產品,現倉儲量爲" + currentCount);
notifyAll();
}
/**
* 消費者方法
* @param neednum
*/
public synchronized void consume(int neednum){
// 噹噹前的消費的數量大於庫存時等待生產
while (currentCount < neednum) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
currentCount -= neednum;
System.out.println("已經消費了" + neednum + "個產品,現倉儲量爲" + currentCount);
notifyAll();
}
}
生產者
package day5;
/**
* <p>Title: Productor.java</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2014</p>
* @author 雪含心
* @date 2014年2月7日
*/
public class Producer extends Thread {
private Warehouse house;
private int neednum;
public Producer(Warehouse house, int neednum){
this.neednum = neednum;
this.house = house;
}
@Override
public void run() {
house.produce(neednum);
}
}
消費者
package day5;
/**
* <p>Title: Consumer.java</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2014</p>
* @author 雪含心
* @date 2014年2月7日
*/
public class Consumer extends Thread {
private Warehouse house;
private int neednum;
public Consumer(Warehouse house, int neednum){
this.neednum = neednum;
this.house = house;
}
@Override
public void run() {
house.consume(neednum);
}
}
測試用例
package day5;
/**
* <p>Title: Test.java</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2014</p>
* @author 雪含心
* @date 2014年2月7日
*/
public class Test {
public static void main(String[] args) {
Warehouse hourse = new Warehouse(30);
while(true){
Consumer c1 = new Consumer(hourse,50);
Consumer c2 = new Consumer(hourse, 20);
Consumer c3 = new Consumer(hourse, 30);
Consumer c4 = new Consumer(hourse,50);
Consumer c5 = new Consumer(hourse, 20);
Consumer c6 = new Consumer(hourse, 30);
Producer p1 = new Producer(hourse, 10);
Producer p2 = new Producer(hourse, 10);
Producer p3 = new Producer(hourse, 10);
Producer p4 = new Producer(hourse, 10);
Producer p5 = new Producer(hourse, 10);
Producer p6 = new Producer(hourse, 10);
Producer p7 = new Producer(hourse, 80);
c1.start();
c2.start();
c3.start();
c4.start();
c5.start();
c6.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
}