• Java中wait和notify方法的详解


    等待和通知的相关方法: 等待的相关方法:
    wait(): 调用wait方法的该线程会进入Waiting状态,只有等待另外的线程的通知或者被中断才会返回,需要注意的是:调用了wait方法后,会释放对象的锁。
    wait(long): 超时等待一段时间,这里的参数时间单位是ms,类型是long,意思是如果等待超过了设定时间还未收到通知,就会超时返回。

    通知的相关方法:
    notify(): 通知一个在对象上等待的线程,使其从wait方法返回,而返回的前提得是该线程获取到了对象的锁。如果没有获取到锁,只是从Waiting状态变成了Blocked状态。
    notify All(): 通知所有在该对象上等待的线程。
    等待和通知的机制,拿两个线程来说,线程A调用了对象O的wait方法进入等待状态,而线程B调用了对象O的notify方法,线程A收到了通知后从对象O的wait方法返回,进而执行后续操作。综上来说,等待和通知是两个线程通过对象来完成交互的。
    对于上述方法使用需要注意的细节:
    1.使用wait()和notify()、notify All()方法时需要先对调用对象加锁。(wait和notify都要搭配synchronized来进行使用。) 而且它们都不属于Thread类,而是属于Object类。
    2.调用wait()方法后,该线程进入Waiting状态,并将当前线程放置到对象的等待队列。
    3.notify()和notify All()方法调用后,等待的线程并不会立即从wait()返回,而是要等调用notify和notify All()的线程释放完锁后, 等待线程才有机会从wait()方法中返回。
    4.notify()方法是将一个等待的线程从等待队列中移到同步队列中,而notify All()方法是将所有的线程从等待队列中移到同步队列。被移动的线程状态从Waiting状态变成Blocked状态。
    5.从wait()方法,返回的前提是获得了调用对象的锁。
    6.synchronized,wait,notify三者的对象都是同一个。
    7.即使当前线程没有在wait,空大调用notify不会有任何的副作用。
    8.如果同一个对象在多个线程中都在wait,那么此时调用当前对象的notify方法,只会随机不指定的唤醒一个线程。如果是多个对象在多个线程中都在wait,那么调用对象的notify方法,就可以唤醒各自对象对应所在的线程。

    总结上述等待和通知的过程:
    最开始是线程A获取了对象的锁,然后调用了对象的wait()方法后,从而释放了锁,并且让线程A进入了对象的等待队列中,进入了Waiting状态。此时由于线程A释放了对象的锁,线程B就有机会随后获取到了对象的锁,并且调用了notify()方法,此时线程A接到了通知,随后就从对象的等待队列进入了同步队列(SynchronizedQueue),此时线程A从Waiting状态进入了Blocked状态,如果线程B又释放完对象的锁后,线程A有机会获取到对象的锁,就会从wait()方法返回继续执行后续的操作。

    文章转自:Java中wait和notify方法的详解_Java-答学网

    作者:答学网,转载请注明原文链接:http://www.dxzl8.com/

  • 相关阅读:
    加入网关后,输入网址报404
    开始SpringCloud
    pytorch 入门 (四)案例二:人脸表情识别-VGG16实现
    poj 2182 Lost Cows
    OpenBox(一个高效通用的黑盒优化系统)安装与使用
    Telegram mini app 登录小部件 | 自定义登录按钮 或 静默登录
    大模型的人工智能能否超越人类?
    【前端面试题2】
    前端性能优化
    第1关:Hive 的 Alter Table 操作
  • 原文地址:https://blog.csdn.net/zl5186888/article/details/126952954