等待唤醒机制:生产者与消费者

public class TestPractice2 {

    

    /*

     * 线程等待唤醒机制:生产者与消费者

     * 生产者和消费者轮流生产和消费

     * 生产者每次生产的产品数量+剩余的产品数量不能大于1000

     * 消费者每次消费不能超过剩余产品数量

     */

    public static void main(String[] args) {

        

        // 产品

        Product product = new Product();

        

        // 生产线

        new Thread(new Producer(product)).start();

        // 消费线

        new Thread(new Consumer(product)).start();

        

    }

    

}

// 生产者

class Producer implements Runnable{

    

    private Product p;

    public Producer(Product p) {

        this.p = p;

    }

 

    @Override

    public void run() {

        while (true) {

            // 开启同步锁

            synchronized (p) {

                // 判断标记

                if (p.flag) {

                    try {

                        // 线程进入等待区 释放同步锁

                        p.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

                // max为最大生产量

                int max = 1000 - p.getCount();

                // i为随机生产量

                int i = (int) (Math.random() * max + 1);

                p.setCount(i + p.getCount());

                System.out.println("生产者生产" + i + "个产品, 产品总计" + p.getCount() + "个。");

                // 修改标记

                p.flag = true;

                // 唤醒等待区中的线程

                p.notify();

            }

        }

    }

    

}

// 消费者

class Consumer implements Runnable {

    

    private Product p;

    public Consumer(Product p) {

        this.p = p;

    }

 

    @Override

    public void run() {

        while (true) {

            // 开启同步锁

            synchronized (p){

                // 判断标记

                if (!p.flag) {

                    try {

                        // 线程进入等待区 释放同步锁

                        p.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

                // i随机消费量

                int i = (int) (Math.random() * p.getCount() + 1);

                p.setCount(p.getCount() - i);

                System.out.println("消费者消费" + i + "个产品,产品剩余" + p.getCount() + "个。");

                // 修改标记

                p.flag = false;

                // 唤醒等待区中的线程

                p.notify();

            }

        }

        

    }

    

}

// 产品类

class Product {

    

    // 初值为0

    private int count = 0;

    // 互斥标志

    boolean flag = false;

    public int getCount() {

        return count;

    }

 

    public void setCount(int count) {

        this.count = count;

    }

    

}

你可能感兴趣的:(多线程,Java)