生产者消费者问题——Java方案

最近有个同学让我帮忙写下多线程,由于不经常使用Java,对多线程忘了差不多了,于是就想来复习一下。然后就自然想到了著名的生产者-消费者问题,于是就写了个小程序来练下手o(∩_∩)o


package stwolf.hustbaidu.java.learn;

public class ProducerConsumer {
public static final int N = 10;
static Producer myProducer = new Producer();
static Consumer myConsumer = new Consumer();
static Monitor myMonitor = new Monitor();

public static void main(String args[]) {
myProducer.start();
myConsumer.start();
}

static class Producer extends Thread //生产者类
{
@Override
public void run() {
int item;
while (true) {
item
= produce_item();
myMonitor.insert(item);
}
}

private int produce_item() //实际生产活动
{
return (int)Math.random();
}
}

static class Consumer extends Thread //消费者类
{
@Override
public void run() {
int item;
while (true) {
item
= myMonitor.remove();
consume_item(item);
}
}

private void consume_item(int item) //实际生产活动
{

}
}

static class Monitor //管程
{
private int[] buffer = new int[N];
private int count = 0, low = 0, high = 0;

public synchronized void insert(int val) {
if (count == N) //缓冲区满,休眠
{
sleep();
}
System.out.println(
"Produce" + high);
buffer[high]
= val;
high
= (high + 1) % N; //设置下一项索引
count++;
if (count == 1) //若消费者在休眠,唤醒消费者
{
notify();
}
}

public synchronized int remove() {
int val;
if (count == 0) ////缓冲区空,休眠
{
sleep();
}
System.out.println(
"Consume" + low);
val
= buffer[low];
low
= (low + 1) % N; //设置下一项索引
count--;
if (count == N - 1) //若生产者在休眠,唤醒生产者
{
notify();
}
return val;
}

private void sleep() {
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}


程序的部分输出如下:

Produce0
Consume0
Produce1
Consume1
Produce2
Consume2
Produce3
Consume3
Produce4
Consume4
Produce5
Consume5
Produce6
Consume6
Produce7
Consume7
Produce8
Consume8
Produce9
Consume9
Produce0
Consume0
Produce1
Produce2
Produce3
Produce4
Produce5
Produce6
Produce7
Produce8
Produce9
Produce0
Consume1
Consume2
Consume3
Consume4
Consume5

posted @ 2010-04-08 22:57  狼の禅  阅读(326)  评论(2编辑  收藏  举报
我要啦免费统计