线程通讯wait&notify

相关概念

  • 锁:解决线程间冲突的问题

  • wait&notify:解决线程间协作的问题

  • wait和sleep的区别

    wait期间对象锁是释放的,而sleep只能延时,并未释放锁

  • 调用wait方法:暂停正在执行的线程,放弃CPU执行权,并释放资源锁

  • 调用notify方法:唤醒暂停的线程使之运行

生产者&消费者模型

场景逻辑:定义两个类,分别为商店和顾客。顾客随机点可乐,鸡翅等食物,商店生产对应的食物,然后顾客食用食物

核心:定义一个全局对象实现多线程情况下线程间的可见,以实现线程协作

package com.noneplus;

public class Main {

    private final Object flag = new Object();

    private static String[] food = {"可乐", "鸡翅", "鸡腿", "披萨"};

    private static String foodType;

    public static void main(String[] args) {

        Main main = new Main();

        Thread store = main.new Store();

        Thread customer1 = main.new Customer();

        store.start();

        customer1.start();

    }

    class Store extends Thread {

        @Override
        public void run() {
            while (true) {

                    synchronized (flag) {
                        flag.notify();
                        if (Main.foodType==null)
                        {
                            System.out.println("暂无订单");
                        }
                        else
                        {
                            System.out.println("生产:" + Main.foodType);
                            try {
                                flag.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                }
            }
        }
    }

    class Customer extends Thread {


        @Override
        public void run() {

            while (true) {
                synchronized (flag) {
                    flag.notify();
                    Main.foodType = Main.food[(int) (Math.random() * 3)];

                    System.out.println("订购:" + Main.foodType);

                    try {
                        flag.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println("食用: " + Main.foodType);
                    System.out.println("===============");
                }
            }
        }
    }
}

订购:可乐
生产:可乐
食用: 可乐
===============
订购:鸡腿
生产:鸡腿
食用: 鸡腿
===============
订购:鸡翅
生产:鸡翅
食用: 鸡翅

参考:Java 多线程编程之:notify 和 wait 用法

posted @ 2020-08-07 17:12  just-reboot  阅读(141)  评论(0编辑  收藏  举报