生产者于消费者

/**
 * 生产者-消费者案例
 * 生产者;需要不停的生产商品,当商品超出库存,不能在生产
 * 消费者;不停的消费商品,当库存为零,不能在消费。
 * <p>
 * 分析:
 * 1.是否是多线程问题
 * 2.是否有共享数据
 * 3.如果解决线程安全问题
 * 4.是否设计线程的通信
 */
//店员
class Clerk {
    private int num = 0;

    public synchronized void xiaoFei() {
        if (num < 20) {
            num++;
            System.out.println(Thread.currentThread().getName() + "开始生产第" + num + "产品");
            //唤醒线程
            this.notify();
        }else {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public synchronized void shengChan() {
        if (num > 0) {
            System.out.println(Thread.currentThread().getName() + "消费者开始消费第" + num + "产品");
            num--;

            this.notify();
        }else {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//生产者
class Proucer extends Thread {

    private Clerk clerk;

    public Proucer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "生产者开始生产");
        while (true) {
            try {
                sleep(110);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.shengChan();
        }
    }
}
//消费者
class Consumer extends Thread {
    private Clerk clerk;


    Consumer(Clerk clerk, String name) {
        this.clerk = clerk;
        super.setName(name);
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "消费者开始消费");
        while (true) {
            try {
                sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.xiaoFei();
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Clerk clerk = new Clerk();
        //生产者
        Proucer p = new Proucer(clerk);
        Thread p1 = new Thread(p, "迪奥");
        Thread p2 = new Thread(p, "跤四大");
        //消费者
        Consumer c = new Consumer(clerk, "吉良吉影");

        p1.start();
        p2.start();
        c.start();
    }
}
原文地址:https://www.cnblogs.com/zk2020/p/14123820.html