Thread之wait和notify

二者应用:多线程通信 (由boolean值、wait( )和notify( )构成了多线程通信)

wait()方法:

 用法:线程调用wait()方法,释放他对锁的拥有权,然后等待另外的线程来通知他
        (通知的方式是notify()或者notifyAll()方法),这样它才能重新获得所的拥有权和恢复执行

    作用:wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。
    限制条件:要确保wait()方法的时候拥有锁,即wait()方法的调用必须放在synchronized方法或者synchronized块中

    与sleep区别:    
        当线程调用wait()方法时,它会释放掉对象的锁,sleep()睡眠不会释放对象的锁的

notify()方法:
    作用:notify()会唤醒一个等待当前锁对象的线程。
    
    唤醒顺序: 如果多个线程在等待(只能唤醒wait方法等待的线程),他们中的一个将会选择被唤醒。这种选择是随意的(有jvm调度决定的)
          被唤醒的线程是不能被立即执行的,需要等到当前线程放弃这个对象的锁
   
    使用方法:notify()方法应该是被拥有对象的锁的线程所调用
    
    使用限制:notify方法调用和wait一样必须放在synchronized方法或synchronized块中,要求在调用时线程已经获得对象的锁

 被阻塞的线程和调用wait等待的线程:

  相同点:都经过锁定区

 其实等待区(调用wait睡眠的线程)的线程 ,在通过notify/notifyAll方法的调用之后是进入锁定区; 而 由于synchronized被阻塞的线程也是在锁定区

  不同点:"优先级"不同

  这两个根本就是一样的,虽然都是睡眠的线程,但是一个是在门里(屋内唤醒),一个是在门外(屋外唤醒);可以理解成被唤醒的线程优先级较高一些

  切记:能进入运行态的只有就绪态了。而就绪态是在获得锁之后才能进入,(所以被唤醒的线程不是立马进入就绪区,而是经过一次锁定区,因为他被唤醒后还得等,唤醒它的那个线程执行结束)

posted @ 2018-03-02 19:25  乱马1/2  阅读(1747)  评论(0编辑  收藏  举报