前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程通讯wait&notify

线程通讯wait&notify

作者头像
Noneplus
发布2020-08-11 10:21:42
3150
发布2020-08-11 10:21:42
举报
文章被收录于专栏:开发笔记开发笔记

相关概念

  • 锁:解决线程间冲突的问题
  • wait&notify:解决线程间协作的问题
  • wait和sleep的区别 wait期间对象锁是释放的,而sleep只能延时,并未释放锁
  • 调用wait方法:暂停正在执行的线程,放弃CPU执行权,并释放资源锁
  • 调用notify方法:唤醒暂停的线程使之运行

生产者&消费者模型

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

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

代码语言:javascript
复制
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("===============");
                }
            }
        }
    }
}
代码语言:javascript
复制
订购:可乐
生产:可乐
食用: 可乐
===============
订购:鸡腿
生产:鸡腿
食用: 鸡腿
===============
订购:鸡翅
生产:鸡翅
食用: 鸡翅

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 相关概念
  • 生产者&消费者模型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档