/**
* 经典例题
* 生产者、消费者问题
* 生产者将产品交给店员,而消费者从店员处取走产品,店员一次只能持有固定量产品(如20),如果生产者试图生产更多产品,店员会叫停生产者。
* 如果店中没有产品了,店员会叫消费者等一下,如果店中有产品了再通知消费者来取走产品。
*
*
* 分析
* 1.是否是多线程问题?是,消费者线程,生产者线程
* 2.是否有共享数据?是,店员(产品数量)
* 3.线程安全问题?同步机制,三种方法
* 4.线程通信问题
*
* @author orz
*/
public class ProductorCustomerTest {
public static void main(String[] args) {
Clerk clerk=new Clerk();
Producer producer=new Producer(clerk);
producer.setName("生产者");
Consumer consumer=new Consumer(clerk);
consumer.setName("消费者");
producer.start();
consumer.start();
}
}
class Clerk
{
private int productCount=0;
//生产产品
public synchronized void produceProduct()
{
if(productCount<20)
{
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
productCount++;
System.out.println(Thread.currentThread().getName()+":开始生产第"+productCount+"个产品");
notify();
}
else
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//消费产品
public synchronized void consumerConsumer()
{
if(productCount>0)
{
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":开始消费第"+productCount+"个产品");
productCount--;
notify();
}
else
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Producer extends Thread
{
private Clerk clerk;
public Producer(Clerk clerk)
{
this.clerk=clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":开始生产产品...");
while (true)
{
clerk.produceProduct();
}
}
}
class Consumer extends Thread{
private Clerk clerk;
public Consumer(Clerk clerk)
{
this.clerk=clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":开始消费产品...");
while (true)
{
clerk.consumerConsumer();
}
}
}