生产者、消费者模式&线程方法wait()、notifiy()、notifiyAll()

25 阅读2分钟

生产者、消费者模式

打一个比方,有三个对象:吃货、餐桌和厨师,分别是消费者、中间缓冲区和生产者。厨师生产面包,放在桌上;桌上摆放面包;吃货从桌上取面包,吃掉。

为了能让行为运转下去,厨师和消费者是两个线程,依靠桌子上是否有面包来判断各自线程需要做的事情:

厨师:如果没有面包,就生产面包;如果有面包,叫吃货来吃面包;

吃货:如果有面包,就吃面包;如果没有面包,叫厨师生产面包;

概念知识参考(blog.csdn.net/kaiwii/arti…

生产者、消费者模式代码实现

/**
 * 桌子:记录是否有面包的标志和提供锁对象
 */
public class Desk {
    /**
     * 是否有面包标志,true表示有,false表示没有
     */
    public static boolean flag = false;

    /**
     * 锁对象
     */
    public static Object lock = new Object();
}
/**
 * 厨师(生产者)
 */
public class Cooker extends Thread {

    @Override
    public void run() {
        while (true) {
            // 给以下代码块设置锁
            synchronized (Desk.lock) {
                // 厨师判断如果有面包
                if (Desk.flag) {
                    try {
                        // 等待吃货来告知没有面包了
                        Desk.lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    // 如果厨师判断没有面包,就生产面包
                    System.out.println("厨师" + Thread.currentThread().getName() + "正在做面包");
                    // 设置桌上有面包,将flag设置为true
                    Desk.flag = true;
                    // 告知吃货线程,桌上有面包了,来吃
                    Desk.lock.notifyAll();
                }
            }
        }
    }
}
/**
 * 吃货(消费者)
 */
public class Foodies extends Thread {

    @Override
    public void run() {
        while (true) {
            synchronized (Desk.lock) {
                // 如果桌上没有面包
                if (!Desk.flag) {
                    try {
                        // 等待厨师来告知有面包了
                        Desk.lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    // 如果吃货判断有面包,就吃面包
                    System.out.println("<<<<<<吃货" + Thread.currentThread().getName() + "正在吃堡包>>>>>>>");
                    // 设置桌上有面包,将true设置为false
                    Desk.flag = false;
                    // 告知厨师线程,桌上没有面包了,去生产
                    Desk.lock.notifyAll();
                }
            }
        }
    }
}
/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        // 创建两个厨师(生产者)线程对象
        Cooker cooker1 = new Cooker();
        Cooker cooker2 = new Cooker();

        // 创建两个吃货(消费者)线程对象
        Foodies foodies1 = new Foodies();
        Foodies foodies2 = new Foodies();
        Foodies foodies3 = new Foodies();
        Foodies foodies4 = new Foodies();

        // 启动它们
        cooker1.start();
        cooker2.start();

        foodies1.start();
        foodies2.start();
        foodies3.start();
        foodies4.start();
    }
}

在这里插入图片描述 如果生产者、消费者只有一个线程,可以不使用notifyAll()方法,而用notify()方法

总结

这里是对生产者、消费者模式一种简单实现,针对这个线程可以衍生出其他情况,如面包是多个的时候,该怎么判断等等

首次发布

hezhongying.blog.csdn.net/article/det…