Java线程中的wait、notify和notifyAll解析

Java线程中的wait、notify和notifyAll解析顾客去包子铺买包子,告知老板自身需求后,进入等待(调用wait()方法)老板处理的过程,此时顾客的状态为WAITING,老板做好包子后,告知(调用notify()方法)顾客包子做好了。?线程间的通信的主要思想是生产者消费者机制。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Java中的线程有六种状态,具体可以查看我之前的文章:
Java中线程的6种状态详解(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)。本文主要讲其中的部分状态切换。

等待唤醒案例:线程间的通信

在这里插入图片描述
顾客去包子铺买包子,告知老板自身需求后,进入等待(调用wait()方法)老板处理的过程,此时顾客的状态为
WAITING,老板做好包子后,告知(调用notify()方法)顾客包子做好了。
?线程间的通信的主要思想是生产者消费者机制。

代码实现

思路如下:

  1. 创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃CPU的执行,进入到WAITING状态(无限等待)
  2. 创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子。

代码如下:
定义一个锁对象:

//创建锁对象,保证唯一
Object obj = new Object();

创建一个顾客线程(消费者):

// 创建一个顾客线程(消费者)
new Thread(){ 
   
    @Override
    public void run() { 
   
        //一直等着买包子
        while(true){ 
   
            //保证等待和唤醒的线程只能有一个执行,需要使用同步技术
            synchronized (obj){ 
   
                System.out.println("顾客告知老板要的包子的种类和数量");
                //调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待)
                try { 
   
                    obj.wait();
                } catch (InterruptedException e) { 
   
                    e.printStackTrace();
                }
                //唤醒之后执行的代码
                System.out.println("包子已经做好了,开吃!");
                System.out.println("---------------------------------------");
            }
        }
    }
}.start();

创建一个老板线程(生产者):

//创建一个老板线程(生产者)
new Thread(){ 
   
    @Override
    public void run() { 
   
        //一直做包子
        while (true){ 
   
            //花了5秒做包子
            try { 
   
                Thread.sleep(5000);//花5秒钟做包子
            } catch (InterruptedException e) { 
   
                e.printStackTrace();
            }

            //保证等待和唤醒的线程只能有一个执行,需要使用同步技术
            synchronized (obj){ 
   
                System.out.println("老板5秒钟之后做好包子,告知顾客,可以吃包子了");
                //做好包子之后,调用notify方法,唤醒顾客吃包子
                obj.notify();
            }
        }
    }
}.start();

输出如下:

顾客告知老板要的包子的种类和数量
老板5秒钟之后做好包子,告知顾客,可以吃包子了
包子已经做好了,开吃!

?注意:
顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行
同步使用的锁对象必须保证唯一
只有锁对象才能调用wait和notify方法。

扩展:Object类中wait带参方法和notifyAll方法

进入到TimeWaiting(计时等待)有两种方式

  1. 使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
  2. 使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态

唤醒的方法:

  • void notify() 唤醒在此对象监视器上等待的单个线程。
  • void notifyAll() 唤醒在此对象监视器上等待的所有线程。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195924.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • HttpCanary下载_Http是

    HttpCanary下载_Http是前言首先,我们无论学习哪个框架,都要带着问题,带着思考去学习思考1:HttpRunner是什么?思考2:HttpRunner的设计模式是什么?思考3:为什么我们要学习HttpRunner?他的

  • 【Linux】rm 命令:删除文件/文件夹

    【Linux】rm 命令:删除文件/文件夹文章目录一、删除文件/文件夹:rm命令二、删除文件(即这个文件被删除)三、删除文件夹四、注意参考链接一、删除文件/文件夹:rm命令rm是强大的删除命令,它可以永久性地删除文件系统中指定的文件或目录。在使用rm命令删除文件或目录时,系统不会产生任何提示信息。此命令的基本格式为:rm[选项]文件或目录选项:-f:强制删除(force),和-i选项相反,使用-f,系统将不再询问,而是直接删除目标文件或目录。-i:和-f正好相反,在删除文件或目录之前,系统会给出提示信

  • wsus补丁服务器搭建_搭建局域网自动更新服务器

    wsus补丁服务器搭建_搭建局域网自动更新服务器1、搭建wsus补丁服务器,在微软官网下载安装包WSUS30-KB972455-x64.exe,地址为:http://www.microsoft.com/en-us/download/details.aspx?id=52162、建议wsus补丁服务器部署在loggetter上,这样省得再买一个winserver2008正版授权,而且就算loggetter故障了,是对整个桌面云…

    2022年10月24日
  • gradient boosting classifier_boosting算法有哪些

    gradient boosting classifier_boosting算法有哪些最近项目中涉及基于GradientBoostingRegression算法拟合时间序列曲线的内容,利用python机器学习包 scikit-learn中的GradientBoosti

  • Python sorted 函数

    Python sorted 函数Pythonsorted函数sorted可以对所有可迭代的对象进行排序操作,sorted方法返回的是一个新的list,而不是在原来的基础上进行的操作。从新排序列表。sorted语法:

  • 解决TortoiseSVN中out of date问题的一个方法

    解决TortoiseSVN中out of date问题的一个方法

    2021年10月17日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号