Java中wait和notify详解

这篇具有很好参考价值的文章主要介绍了Java中wait和notify详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线程的调度是无序的,随机的,但是也是有一定的需求场景,希望能够有序执行,join算是一种控制顺序的方式(功能有限)——》一个线程执行完,才能执行另一个线程!

本文主要讲解的:wait和notify则有一下功能:

wait:就是让某个线程先暂停下来,等一等

notify:就是把该线程唤醒,能够继续执行

wait:发现条件不满足/时间不成熟,就先阻塞等待

notify:其他线程构造了一个成熟的条件,就可以唤醒wait的等待

wait和notify都是Object的方法,只要你是个类对象(不是基本的数据类型)都可以使用wait和notify

Object.wait主要做的三件事:

  1. 解锁(先加锁,才能解锁)
  2. 阻塞等待
  3. 当收到通知的时候,就会唤醒,同时尝试重新获取锁

wait必须写到synchronized代码块里面~

notify也是要放到synchronized中使用的~

public class Main4 {
    public static void main(String[] args) throws InterruptedException {

        Object object=new Object();
        //加锁对象必须和wait的对象是同一个
        synchronized (object){
            object.wait();
        }
    }
}

加锁对象必须和wait的对象是同一个

对于wait和notify而言:值得注意的是:

必须要先执行wait,然后notify,此时才有效果~
如果现在还没有wait,就notify,相当于:一炮打空(没有额外的副作用,但是代码的功能不能正确执行了!),此时wait无法唤醒,代码也不会出现其他异常~!!

我们来看一下下述代码:

public class Main5 {
    public static void main(String[] args) throws InterruptedException{
        Object locker=new Object();
        Thread t1= new Thread(()->{
            while (true){
                    try {
                        System.out.println("wait 开始");
                        synchronized (locker) {
                            locker.wait();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
        });
        t1.start();
//让t1先启动,主线程休息1秒,在主线程休息1秒的过程中,
// t1线程应该执行到:synchronized (locker) {locker.wait(); }的位置,等1秒钟数据到t2开始执行notify

        Thread.sleep(1000);
        Thread t2=new Thread(()->{
            synchronized (locker){
                System.out.println("notify 开始");
                locker.notify();
                System.out.println("notify 结束");
            }
        });
        t2.start();
    }
}

上述代码的运行结果为:

Java中wait和notify详解,操作系统哪些事?,java要笑着学,java,开发语言,java-ee

解析:t1先执行,执行到了wait就阻塞了,t1之后t2开始执行,执行到了notify就会通知t1线程开始唤醒(注意:notify是在synchronized内部,就需要t2释放了锁,t1才能继续往下走~

在上述代码中,虽然是t1先执行的,但是可以通过wait,notify控制,让t2先执行一些逻辑,t2执行完之后,notify唤醒t1,t1在继续往下执行~

使用wait阻塞等待会让线程进入WAITING状态

wait也提供了一个带参数的版本,参数指定的是最大等待时间!

不带参数的wait是死等,带参数的wait就会等到最大时间之后,还没人通知,就自己唤醒自己!!

join只能是让t2线程执行完,再继续执行t1,一定是串行的

wait和notify可以让t2线程执行完,再让t1执行……,t1执行完一部分,再让t2执行,t2在执行一部分,在让t1执行…………

对于唤醒操作,还有一个notifyAll(notify用的比较多)

可以有多个线程,等待同一个对象的情况!!如:在t1,t2,t3中都调用了object.wait,此时在main中,调用了object.notify,会随机唤醒t1,t2中的一个线程,另外两个仍然是WAITING状态!如果调用了object.notifyAll,此时就会把t1,t2,t3的三个线程都唤醒,此时三个线程就会重新竞争锁,然后依次执行……

wait和sleep的对比(面试题)

由于wait有一个带参数的版本,用来体现超时时间,这个感觉跟sleep差不多!!

wait也能提前唤醒,sleep也能提前唤醒,

wait解决的是线程之间的顺序控制,sleep单纯的是让当前线程休眠一会!

唯一相同点是:都可以让线程放弃执行一段时间!

wait需要搭配synchronized使用,sleep不需要

wait是Object的方法,sleep是Thread的静态方法~文章来源地址https://www.toymoban.com/news/detail-703527.html

到了这里,关于Java中wait和notify详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统--磁盘调度算法(FCFSSSTFSCANCSCAN)Java实现

    一、先来先服务算法(FCFS) 根据进程请求访问磁盘的先后次序进行调度。 二、最短时间优先算法(SSTF) 选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。 三、扫描算法(SCAN) 在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作

    2024年02月08日
    浏览(43)
  • Hadoop 使用Linux操作系统与Java熟悉常用的HDFS操作

    注意看评论区获取完整代码资料 目录 一、实验目的 二、实验平台 三、实验步骤 理解HDFS在Hadoop体系结构中的角色; 熟练使用HDFS操作常用的Shell命令; 熟悉HDFS操作常用的Java API。 操作系统:Linux(建议Ubuntu16.04); Hadoop版本:2.7.1; JDK版本:1.8或以上版本; Java IDE:Eclipse。

    2024年02月03日
    浏览(51)
  • 【操作系统】一文快速入门,很适合JAVA后端看

    作者简介: 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 操作系统可以看作一个计算机的管理系统,对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块:运算器、控制器、存储器、输入设备、输出设备。操作系统实际上就是对这个五块资源各自提

    2024年02月10日
    浏览(38)
  • 页面置换算法模拟实现-操作系统课程设计基于Java

    存储管理的主要功能之一是合理的分配空间,请求页式存储管理是一种常用的虚拟存储管理技术。在地址映射过程中,若在页表中发现所要访问的页面不在内存,则产生中断,当发生中断时,系统必须在内存选择一个页面移出内存,调用页面置换算法,以便为调入新的页面让

    2024年02月07日
    浏览(42)
  • mac操作系统 java 调用tdengine时序数据库

    sudo ln -s /usr/local/lib/libtaos.1.dylib /Users/ admin /Library/Java/Extensions/libtaos.1.dylib admin 为你自己用户目录 即可正常使用

    2024年02月12日
    浏览(54)
  • 针对java程序员的了解细节操作系统与进程

    一、💛   操作系统(浅浅概念 ):是用来搞管理软件的                                            1.对下,要管理各种硬件设备                                            2.对上,要给应用程序提供一个稳定的运行环境 二、💙 进程 : 正在运行 的程序,假如程序

    2024年02月14日
    浏览(38)
  • Java 使用 oshi 获取当前服务硬件信息(操作系统、CPU、内存、磁盘)

    这里需要引入两个依赖包: HardWareUtil: CpuInfo: JvmInfo: MemoryInfo: SysFile: SystemDetails: SizeEnum: 控制台输出: CpuInfo(cpuNum=16, total=16501.0, sys=329.0, used=657.0, wait=0.0, free=15419.0) JvmInfo(total=2.64241152E8, max=4.211081216E9, free=2.5297664E8, version=11.0.18, home=C:Program FilesJavajdk-11) SystemDetails(

    2024年02月05日
    浏览(57)
  • 服务器操作系统有哪些

    服务器操作系统有哪些 电脑想要运行就离不开操作系统,而服务器想要正常运行同样也离不开操作系统,那你知道服务器系统有哪些?服务器系统与电脑系统有什么区别?这些问题就由壹基比小鑫在下文中来告诉大家。 服务器系统有哪些? 1、Windows服务器操作系统 环境部署

    2024年02月06日
    浏览(42)
  • 【Java】【OS】操作系统理发店问题通过应用小程序动态实现(1)

    He/she will spend a random time on the chair before send the ready flag to the barber. */ public synchronized void sitBarberChair(BarberShopApplet applet, int id) { while(customerSofaQ[sofaBottom] != id) { System.out.println(\\\"Customer \\\" + id + “is waiting for the chair turn”); try{ wait(); } catch(InterruptedException e) { } } while(chairFull()) { try {

    2024年04月23日
    浏览(51)
  • 【操作系统的IO模型有哪些?】

    为了保护操作系统的安全,通过缓存加快系统读写,会将内存分为 用户空间和内存空间 两个部分。 如果用户想要操作内核空间的数据 , 则需要把数据从内核空间拷贝到用户空间(数据会放到内核空间的page cache中,这种也叫做缓存IO)。 举个栗子: 如果服务器收到了从从客

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包