您的位置:首页 > 编程语言 > Java开发

Java多线程 生产者消费者问题 (2)

2009-10-30 08:37 288 查看
一个使用了队列的通用实现:

http://blog.csdn.net/chaosllgao/archive/2009/05/23/4211183.aspx

此文描述了一种更简单的模型

1. 同时只有1个生产者和1个消费者

2. 不用队列,同时只有一个产品

3. 生产者每次生产1个0到100之间的随机数,消费者则把该随机数打印出来。如果产生的随机数为0,则生产者、消费者均退出运行

import java.util.Random;

public class ProducerConsumer
{
public static void main(String[] args)
{
Product product = new Product();
Producer producer = new Producer(product);
Consumer consumer = new Consumer(product);

producer.start();
consumer.start();
}

private static class Product
{
public int value = -1;
}

private static class Producer extends Thread
{
private Product product = null;

public Producer(Product product)
{
this.product = product;
}

public void run()
{
Random rand = new Random();
while (true)
{
try
{
synchronized (product)
{
//Must use "while" clause
while (product.value > 0)
{
product.wait();
}

product.value = rand.nextInt(101);

product.notifyAll();

if (product.value == 0)
{
break;
}
}
Thread.sleep(100);
}
catch (Exception e)
{
e.printStackTrace();
}
}
System.out.println();
System.out.println("Producer Terminated");
}
}

private static class Consumer extends Thread
{
private Product product = null;

public Consumer(Product product)
{
this.product = product;
}

public void run()
{
int i = 0;
while (true)
{
try
{
synchronized (product)
{
//Must use "while" clause
while (product.value < 0)
{
product.wait();
}
System.out.print(product.value + " ");
System.out.flush();

i++;
if (i % 10 == 0)
{
System.out.println();
}

product.notifyAll();

if (product.value == 0)
{
break;
}
product.value = -1;
}
Thread.sleep(100);
}
catch (Exception e)
{
e.printStackTrace();
}
}
System.out.println();
System.out.println("Consumer Terminated");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: