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被阻塞的线程也是在锁定区
不同点:"优先级"不同
这两个根本就是一样的,虽然都是睡眠的线程,但是一个是在门里(屋内唤醒),一个是在门外(屋外唤醒);可以理解成被唤醒的线程优先级较高一些
切记:能进入运行态的只有就绪态了。而就绪态是在获得锁之后才能进入,(所以被唤醒的线程不是立马进入就绪区,而是经过一次锁定区,因为他被唤醒后还得等,唤醒它的那个线程执行结束)