程序
//生产者消费者问题
//生产者生产上限是20
class Products
{
private static int proCounts=0;
public void produce()
{
proCounts++;
}
public void consume()
{
proCounts--;
}
public int getProCounts()
{
return proCounts;
}
}
//生产者线程
class Producer extends Thread
{
private Products product;
public Producer(Products product)
{
this.product=product;
}
public void run()
{
while(true)
{
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(Products.class)
{
if (product.getProCounts() < 20) {
product.produce();
System.out.println(Thread.currentThread().getName() + ":生产第"
+ product.getProCounts() + "件产品");
Products.class.notify();
} else {
//生产已经达到了阈值,不能再生产了,因此等待消费者消费后进行唤醒
try {
Products.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
//消费者线程
class Consumer extends Thread
{
private Products product;
public Consumer(Products product)
{
this.product=product;
}
public void run()
{
while(true) {
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (Products.class) {
if (product.getProCounts() > 0) {
System.out.println(Thread.currentThread().getName() + ":消费第"
+ product.getProCounts() + "件产品");
product.consume();
Products.class.notify();
} else {
//产品已经被消费完了,因此需要等待生产者生产出产品才可继续消费
try {
Products.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public class ProductAndConsumer {
public static void main(String[] args) {
Products product=new Products();
Producer p1=new Producer(product);
Consumer c1=new Consumer(product);
p1.setName("生产者1");
c1.setName("消费者1");
p1.start();
c1.start();
}
}
需要注意的几个地方:
1、和以往不同的是,之前都是创建一个类,创建这个类的多个线程。这次是创建两个类,每个类创建一个线程,这就导致了synchronized锁
的同步监视器不好选取
但是这两个类都有同一个类的成员变量,并且以这一个类作为了成员变量的值
成员变量
都初始化这个成员变量为同一个值
因此我们选取这个类作为同步监视器
2、同时要注意notify()
和wait()
的调用者要与同步监视器一起,因此