多线程———生产者和消费者(等待唤醒机制)彻底理解以及代码实现

目录

一、何为等待唤醒机制(生产者消费者模式)?

如何实现等待唤醒机制?

二、等待唤醒机制(生产者消费者模式)代码实现:

1、生产者代码:

2.桌子代码(控制生产者和消费者):

3.消费者代码:

4.测试结果代码:

5.结果截图:


一、何为等待唤醒机制(生产者消费者模式)?

线程的执行具有随机性,哪个线程抢到执行权才会执行。如果程序中有两条线程AB,那他们的执行顺序可能是:

多线程———生产者和消费者(等待唤醒机制)彻底理解以及代码实现_第1张图片

 等待唤醒机制就是要打破随机执行规则,让两个线程轮流执行:

如何实现等待唤醒机制?

设置A线程生产者去生产数据,B线程消费者去消费数据。我们可以把生产者看做一个厨师,消费者看做是一个顾客。顾客进入餐厅后,看桌子上是否有食物,如果有则开吃,吃完后唤醒厨师继续做;如果桌子上没有食物就进行等待。厨师首先判断桌子上是否有食物,如果有则等待顾客吃,没有食物就会制作食物并把食物放到桌子上并叫醒正在等待的顾客吃饭。

多线程———生产者和消费者(等待唤醒机制)彻底理解以及代码实现_第2张图片

 其中涉及的代码方法:

多线程———生产者和消费者(等待唤醒机制)彻底理解以及代码实现_第3张图片

二、等待唤醒机制(生产者消费者模式)代码实现:

1、生产者代码:

package com.songqiao.threadwaitanddnotify;

public class Cooker extends Thread {
    @Override
    public void run() {
        while (true){
            synchronized (Desk.lock){
                //判断还能做几份
                if(Desk.count==0){
                    break;
                }else {
                    //判断桌子上是否有食物
                    if (Desk.foodFlag==1){
                        try {
                            //有 等待
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //没有 制作食物
                    System.out.println("厨师开火,厨师还能做:"+Desk.count+"碗面条!");
                    //把食物放桌子上
                    Desk.foodFlag=1;
                    //叫醒等待的顾客开吃
                    Desk.lock.notifyAll();
                }
            }




        }
    }
}

2.桌子代码(控制生产者和消费者):

package com.songqiao.threadwaitanddnotify;

public class Desk {
    /**
     * 控制生产者和消费者的执行
     */

    //表示桌子上是否有面条,0:没有 1:有
    public static int foodFlag=0;

    //总个数,表示最多吃10份
    public static int count=10;

    //锁对象
    public static Object lock=new Object();
}

3.消费者代码:

package com.songqiao.threadwaitanddnotify;

public class Consumers extends Thread{
    @Override
    public void run() {
        /**
         * 1.循环
         * 2.同步代码块
         * 3.判断共享数据是否到末尾(先写到了末尾)
         * 4.没有到末尾的情况(执行核心逻辑)
         */
        while (true){
            synchronized (Desk.lock){
                if(Desk.count==0){
                    break;
                }else {
                 //先去判断桌子上是否有面条
                    if(Desk.foodFlag==0){
                        //没有 等待
                        try {
                            //让当前线程跟锁进行绑定
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }else {
                        //把吃的总数-1
                        Desk.count--;
                        //有 开吃
                        System.out.println("顾客开始吃饭,还能吃:"+Desk.count+"碗面条!");
                        //吃完 唤醒厨师继续做
                        Desk.lock.notifyAll();
                        //修改桌子状态
                        Desk.foodFlag=0;
                    }
                }
            }
        }
    }
}

4.测试结果代码:

package com.songqiao.threadwaitanddnotify;

public class ThreadDemo {
    public static void main(String[] args) {
        /**
         * 生产者与消费者代码-实现线程轮流交替执行
         */
        Consumers consumers=new Consumers();
        Cooker cooker=new Cooker();

        consumers.start();
        cooker.start();
    }
}

5.结果截图:

多线程———生产者和消费者(等待唤醒机制)彻底理解以及代码实现_第4张图片

 

你可能感兴趣的:(java基础,java,开发语言)