zoukankan      html  css  js  c++  java
  • java 多线程之:wait()、notify()、notifyAll()等方法

    1. wait()、notify()、notifyAll()等方法介绍:
      在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。
      而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。
      Object类中关于等待/唤醒的API详细信息如下:
      notify() -- 唤醒在此对象监视器上等待的单个线程。
      notifyAll() -- 唤醒在此对象监视器上等待的所有线程。
      wait() -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。
      wait(long timeout) -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
      wait(long timeout, int nanos) -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量”,当前线程被唤醒(进入“就绪状态”)。

    2. 为什么notify(), wait()等函数定义在Object中,而不是Thread中?
      Object中的wait(), notify()等函数,和synchronized一样,会对“对象的同步锁”进行操作。
      wait()会使“当前线程”等待,因为线程进入等待状态,所以线程应该释放它锁持有的“同步锁”,否则其它线程获取不到该“同步锁”而无法运行!
      OK,线程调用wait()之后,会释放它锁持有的“同步锁”;而且,根据前面的介绍,我们知道:等待线程可以被notify()或notifyAll()唤醒。现在,请思考一个问题:notify()是依据什么唤醒等待线程的?或者说,wait()等待线程和notify()之间是通过什么关联起来的?答案是:依据“对象的同步锁”。
      负责唤醒等待线程的那个线程(我们称为“唤醒线程”),它只有在获取“该对象的同步锁”(这里的同步锁必须和等待线程的同步锁是同一个),并且调用notify()或notifyAll()方法之后,才能唤醒等待线程。虽然,等待线程被唤醒;但是,它不能立刻执行,因为唤醒线程还持有“该对象的同步锁”。必须等到唤醒线程释放了“对象的同步锁”之后,等待线程才能获取到“对象的同步锁”进而继续运行。
      总之,notify(), wait()依赖于“同步锁”,而“同步锁”是对象锁持有,并且每个对象有且仅有一个!这就是为什么notify(), wait()等函数定义在Object类,而不是Thread类中的原因。

  • 相关阅读:
    sql 用户自定义表类型和使用
    java idea常用快捷键
    sql强大的行转列功能(内置函数pivot及注意事项)(转载)
    while循环,for循环
    基本运算符,流程控制之if判断
    常量,基本数据类型,输入输出,基本运算符
    python解释器安装,运行python程序的方式及程序运行的步骤,变量与自动的内存管理
    计算机硬件基础知识普及,操作系统,编程语言分类
    计算机硬件组成与工作原理
    面向对象编程,类与对象的使用,内置函数
  • 原文地址:https://www.cnblogs.com/cag2050/p/7282756.html
Copyright © 2011-2022 走看看