• 线程通讯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 用法

  • 相关阅读:
    BZOJ 1707 [Usaco2007 Nov]tanning分配防晒霜
    BZOJ2697:特技飞行
    Bridging signals(NlogN最长上升子序列)
    HDU 4291 A Short problem(矩阵+循环节)
    计蒜之道 初赛第一场B 阿里天池的新任务(简单)
    1008: [HNOI2008]越狱
    1022: [SHOI2008]小约翰的游戏John
    1192: [HNOI2006]鬼谷子的钱袋
    2456: mode
    BZOJ-1968
  • 原文地址:https://www.cnblogs.com/noneplus/p/13454024.html
Copyright © 2020-2023  润新知