/**
* 生产者将产品交给店员,而消费者从店员处取走产品,店员一次只能取走固定数量的产品比如20,如果生产者试图生产更多产品,
* 店员会叫生产者停一下,如果店中有空位放产品了,再通知生产者继续生产,如果店中没有产品了,店员会告诉消费者等一下, 如果店中有产品了,再通知消费者来拿
*
* @author pomay
* 分析:
* 1.是否涉及到多线程问题?是 生产者、消费者
* 2.是否有共享数据? 有
* 3.此共享数据是? 产品的数量
* 4.是否涉及到线程的通信? 是
*
*/
class Productor implements Runnable// 生产者
{
Clerk clerk;
public Productor(Clerk clerk)
{
super();
this.clerk = clerk;
}
@Override
public void run()
{
System.out.println("生产者开始生产产品");
while (true)
{
try
{
Thread.currentThread().sleep(100);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.addProduct();
}
}
}
class Consumer implements Runnable// 消费者
{
Clerk clerk;
public Consumer(Clerk clerk)
{
super();
this.clerk = clerk;
}
@Override
public void run()
{
System.out.println("消费者开始消费产品");
while (true)
{
try
{
Thread.currentThread().sleep(100);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.delProduct();
}
}
}
class Clerk// 店员
{
int product;
public synchronized void addProduct()// 生产产品
{
if (product >= 20)
{
try
{
wait();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
{
product++;
System.out.println(Thread.currentThread().getName() + ":生产了第" + product + "个产品");
notify();
}
}
public synchronized void delProduct()// 消费产品
{
if (product <= 0)
{
try
{
wait();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
{
System.out.println(Thread.currentThread().getName() + ":消费了第" + product + "个产品");
product--;
notify();
}
}
}
public class ProductConsume
{
public static void main(String[] args)
{
Clerk clerk = new Clerk();
Productor p1 = new Productor(clerk);
Productor p2 = new Productor(clerk);
Consumer c1 = new Consumer(clerk);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
Thread t3 = new Thread(c1);
t1.setName("生产者1");
t2.setName("生产者2");
t3.setName("消费者1");
t1.start();
t2.start();
t3.start();
}
}
线程之生产者消费者
最新推荐文章于 2022-11-16 09:09:33 发布