生产者-消费者问题

来源:互联网 发布:mac电脑散热器声音很大 编辑:程序博客网 时间:2024/05/16 01:11

问题如下:
1)若消费者先抢到CPU执行权,会先消费资源;但若此时没有资源 ,应当先生产再消费;
2)若生产者先抢到CPU执行权,会先生产资源;但若此时有资源,应当先消费再生产;

解决思路:
1)对生产者而言,先查看是否有资源,有就等待,无就等待消费者消费完之后,通知生产
2)对消费者而言,先查看是否有资源,有就消费,无就等待生产者生产完之后,通知消费

Java代码实现:synchronized+wait/notifyAll

public class ProductConsumer {    private static int res = 10; // 资源    static Object objLock = new Object();// 同步锁对象    static boolean haveRes = false;// 标志位,是否有资源    public static void main(String[] args) {        Thread product = new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    synchronized (objLock) {                        if (haveRes) {                            try {                                objLock.wait();                            } catch (InterruptedException e) {                                e.printStackTrace();                            }                        }                        res--;                        if (res > 0)                            System.out.println(res);                        haveRes = !haveRes;                        objLock.notify();                    }                }            }        });        Thread consumer = new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    synchronized (objLock) {                        if (!haveRes) {                            try {                                objLock.wait();                            } catch (InterruptedException e) {                                e.printStackTrace();                            }                        }                        res--;                        if (res > 0)                            System.out.println(res);                        haveRes = !haveRes;                        objLock.notify();                    }                }            }        });        product.start();        consumer.start();    }}

代码输出:

987654321
原创粉丝点击