模拟管程解决解决生产者-消费者问题
在利用管程方法来解决生产者-消费者问题时,首先便是为它
们建立一个管程,并命名为procducerconsumer,或简称为
PC。
• 其中包括两个过程:
• (1) put(x)过程。
• (2) get(x)过程。
java实现:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
public static void main(String[] args) {
Main main=new Main();
Producer_Customer p_c=main.new Producer_Customer();
Producer p=main.new Producer(p_c);
Customer c=main.new Customer(p_c);
p.start();
c.start();
}
class Producer_Customer{
public static final int bufferSize=20;
private int count;
private Lock lock;
private Condition notFull;
private Condition notEmpty;
public Producer_Customer() {
this.count = 0;
this.lock = new ReentrantLock();
this.notEmpty = lock.newCondition();
this.notFull = lock.newCondition();
}
//put过程
public void put() {
lock.lock();
while(count == bufferSize){
try {
notFull.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println("放入第"+count+"号缓冲区");
notEmpty.signal();
lock.unlock();
}
//get过程
public void get() {
lock.lock();
while(count == 0){
try {
notEmpty.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--;
System.out.println("从第"+ count+"号缓冲区拿出");
notFull.signal();
lock.unlock();
}
}
/**
* 生产者
*/
class Producer extends Thread{
private Producer_Customer p_c;
public Producer(Producer_Customer p_c) {
this.p_c=p_c;
}
@Override
public void run() {
while(true) {
p_c.put();
}
}
}
/**
* 消费者
*/
class Customer extends Thread{
private Producer_Customer p_c;
public Customer(Producer_Customer p_c) {
this.p_c=p_c;
}
@Override
public void run() {
while(true) {
p_c.get();
}
}
}
}
运行结果: