生产者-消费者问题
计算机系统中,每一个进程都申请使用和释放各种不同类型的资源,这些资源既可以像外设、内存、缓冲区等硬件资源,也包括临界区、数据、例程等软件资源,把系统中使用的某一类资源的进程称为消费者,而把释放同类资源的进程称之为该资源的生产者。
生产者和消费者的问题是一个同步问题。把一个长度为n的有界缓冲区与一群生产者进程P1,P2,P3.....和一群消费者进程C1,C2,C3.....联系起来。
生产者和消费者之间应该满足如下条件:
(1)消费者想接收数据时,有界缓冲区中至少有一个单元是满的。
(2)生产者想发送数据时,有界缓冲区中至少有一个单元是空的。
//有界缓冲区
package com.swust.second;
public class Buffer {
private int contents;
private boolean available = false;
public synchronized int get(){
while(! available){
try {
this.wait();
} catch (InterruptedException e) {
// TODO: handle exception
}
}
int value = contents;
//消费者取出内容,改变存贮控制available
available = false;
System.out.println("取出:"+contents);
this.notify();
return value;
}
public synchronized void put(int value){
while(available){
try {
this.wait();
} catch (InterruptedException e) {
// TODO: handle exception
}
}
contents = value;
//生产者放入内容,改变存取控制available
available = true;
System.out.println("放入:"+contents);
this.notifyAll();
}
}
//生产者
package com.swust.second;
//生产者线程
public class Producter extends Thread{
private Buffer buffer;
private int number;
public Producter(Buffer buffer, int number) {
super();
this.buffer = buffer;
this.number = number;
}
public void run(){
for(int i=0;;){
buffer.put(i);
System.out.println("生产者:"+number+"生产"+i++);
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
// TODO: handle exception
}
}
}
}
//消费者
package com.swust.second;
public class Consumer extends Thread{
private Buffer buffer;
private int number;
public Consumer(Buffer buffer, int number) {
super();
this.buffer = buffer;
this.number = number;
}
public void run(){
for(;;){
int v = buffer.get();
System.out.println("消费者 "+number+"消费"+v);
}
}
}
//主程序
package com.swust.second;
public class Consumer extends Thread{
private Buffer buffer;
private int number;
public Consumer(Buffer buffer, int number) {
super();
this.buffer = buffer;
this.number = number;
}
public void run(){
for(;;){
int v = buffer.get();
System.out.println("消费者 "+number+"消费"+v);
}
}
}
//效果