多线程-生产者和消费者问题

生产者和消费者问题

生产者和消费者的问题是一个线程通信的例子。
比如买馒头,需要先进行生产,生产了就通知消费者来吃馒头。如果馒头没了就通知生产者继续生产。

public class Test {
    public static void main(String[] args) {
        Click click = new Click(0);

        new Thread(new Productor(click),"生产").start();
        new Thread(new Consumer(click),"消费").start();
    }
}
//生产者
class Productor implements Runnable{
    private Click click;
    Productor(Click click){
        this.click = click;
    }
    @Override
    public void run() {
        while (true){
            synchronized (click) {
                if (click.num < 10) {
                    click.num++;
                    System.out.println(Thread.currentThread().getName() + "第:" + click.num + "个商品");
                    click.notify();
                } else {
                    try {
                        click.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
//消费者
class Consumer implements Runnable{
    private Click click;
    Consumer(Click click){
        this.click = click;
    }
    @Override
    public void run() {
        while (true) {
            synchronized (click) {
                if (click.num > 0) {
                    System.out.println(Thread.currentThread().getName() + "第:" + click.num + "个商品");
                    click.num--;
                    click.notify();
                } else {
                    try {
                        click.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
//馒头店
class Click{
    int num;
    Click(int num){
        this.num = num;
    }
}

运行结果:

这里需要注意synchronized的锁对象应该是馒头店,不能是this。因为馒头店只有一个,而this指当前对象,生产者和消费者都创建了,所以使用this不行。

原文地址:https://www.cnblogs.com/Z-Dey/p/12896393.html