生产者-消费者问题

        计算机系统中,每一个进程都申请使用和释放各种不同类型的资源,这些资源既可以像外设、内存、缓冲区等硬件资源,也包括临界区、数据、例程等软件资源,把系统中使用的某一类资源的进程称为消费者,而把释放同类资源的进程称之为该资源的生产者。

  生产者和消费者的问题是一个同步问题。把一个长度为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);
}
}
}

//效果

posted @ 2020-01-15 16:48  雪瞳  阅读(332)  评论(0编辑  收藏  举报