实验目的
模拟生产者消费者问题
实验仪器
64 位操作系统, 基于 x64 的处理器 / SublimeText3
实验框图(流程图)
实验基本原理(源程序)
算法说明:
生产者在缓冲区满后,进入休眠。直到消费者在缓冲区中消耗数据后,生产者才会被唤醒
消费者在缓冲区空后,进入休眠。直到生产者向缓冲区中添加数据后,消费者才会被唤醒
将curNum(缓冲区中的现有数据量),maxNum(缓冲区中最大数据量),lock(互斥锁)封装在静态mutex类中
每次生产者生产一次或者消费者消费一次,唤醒其他所有线程
代码:
public class Tomato {
static class mutex {
public static int curNum = 0;
public static int maxNum = 10;
public static Object lock = new Object();
}
static class Producer extends Thread {
public void run() {
while (true) {
synchronized (mutex.lock) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (mutex.curNum == 0) {
System.out.println("物品栏已空,开始生产");
try {
mutex.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mutex.curNum --;
System.out.println("消费了一个番茄...物品栏中还剩下" + mutex.curNum + "个番茄");
mutex.lock.notifyAll();
}
}
}
}
static class Consumer extends Thread {
public void run() {
while (true) {
synchronized (mutex.lock) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (mutex.curNum >= mutex.maxNum) {
System.out.println("物品栏已满,开始消费");
try {
mutex.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mutex.curNum ++;
System.out.println("生产了一个番茄...物品栏中有" + mutex.curNum + "个番茄");
mutex.lock.notifyAll();
}
}
}
}
public static void main(String[] args) {
Producer producer = new Producer();
Consumer consumer = new Consumer();
producer.start();
consumer.start();
}
}